Linux에서 at 및 batch를 사용하여 명령을 예약하는 방법

한 번만 발생하는 Linux 작업을 예약하려는 경우 cron은 과도합니다. at 계열의 명령이 당신에게 필요한 것입니다! 시스템에 여유 리소스가 있을 때만 프로세스를 실행하려는 경우 일괄 처리를 사용할 수 있습니다.

Linux 작업을 예약하는 방법

cron 데몬은 특정 시간에 실행되는 작업 목록. 이러한 작업과 프로그램은 예약된 시간에 백그라운드에서 실행됩니다. 이를 통해 반복해야 하는 작업을 예약하는 데 큰 유연성을 제공합니다. 한 시간에 한 번, 매일 특정 시간에, 또는 한 달이나 일년에 한 번 작업을 실행해야 하는 경우 cron에서 설정할 수 있습니다.

그러나 작업을 한 번만 실행하도록 예약하려는 경우에는 도움이 되지 않습니다. 물론 cron에서 설정할 수 있지만 다시 돌아가서 제거하는 것을 기억해야 합니다. crontab 항목 작업이 실행된 후 불편합니다.

Linux를 사용하면 문제로 어려움을 겪고 있다면 다른 사람도 문제로 어려움을 겪고 있다는 것이 거의 보장됩니다. 다행스럽게도 Unix 계열 운영 체제가 너무 오래 사용되었기 때문에 누군가가 문제에 대한 솔루션을 만들었을 가능성도 있습니다.

위에 설명된 문제에 대해, 그들은 가지고 있으며, 호출됩니다.

at 명령 설치

Ubuntu 18.04 및 Manjaro 18.1.0에 설치해야 했습니다(이미 Fedora 31에 설치되어 있음).

Ubuntu에 설치하려면 다음 명령을 사용하십시오.

sudo apt-get install at

그만큼

설치가 완료되면 다음 명령을 사용하여 at 데몬을 시작할 수 있습니다.

sudo systemctl enable --now atd.service

그만큼

Manjaro에서는 다음 명령을 사용하여 에 설치합니다.

sudo pacman -Sy at

그만큼

설치가 완료되면 다음 명령을 입력하여 at 데몬을 시작합니다.

sudo systemctl enable --now atd.service

그만큼

모든 배포에서 다음 명령을 입력하여 atd 데몬이 실행 중인지 확인할 수 있습니다.

ps -e | grep atd

그만큼

at 명령을 대화식으로 사용하는 방법

at을 사용하려면 실행할 날짜와 시간을 지정해야 합니다. 이 문서의 뒷부분에서 다룰 내용을 작성하는 방법에는 상당한 유연성이 있습니다.

그러나 at을 대화식으로 사용하더라도 날짜와 시간을 미리 제공해야 합니다. 명령줄에 아무것도 포함하지 않거나 날짜 및 시간이 아닌 항목을 입력하면 at은 아래와 같이 “시간 왜곡”으로 응답합니다.

at
at banana

의 잘못된 사용

날짜와 시간은 명시적이거나 상대적일 수 있습니다. 예를 들어 지금부터 1분 후에 명령을 실행하고 싶다고 가정해 보겠습니다. at은 “지금”이 무엇을 의미하는지 알고 있으므로 다음과 같이 now를 사용하고 여기에 1분을 추가할 수 있습니다.

at now + 1 minute

그만큼

at은 메시지와 at 프롬프트를 출력하고 예약하려는 명령을 입력할 때까지 기다립니다. 하지만 먼저 아래와 같은 메시지를 고려하십시오.

  Mac은 할 수 있지만 PC는 할 수 없는 12가지 기본 기능

그만큼

sh 쉘의 인스턴스를 시작할 때 알려주고 다음을 수행합니다. 그 안에서 명령을 실행. 명령은 sh 셸과 호환되지만 더 풍부한 기능 세트가 있는 Bash 셸에서 실행되지 않습니다.

명령이나 스크립트가 Bash가 제공하는 기능이나 기능을 사용하려고 시도하지만 sh가 제공하지 않는 경우 실패합니다.

명령이나 스크립트가 sh에서 실행되는지 여부를 쉽게 테스트할 수 있습니다. sh 명령을 사용하여 sh 셸을 시작합니다.

sh

그만큼

명령 프롬프트가 달러 기호($)로 바뀌고 이제 명령을 실행하고 올바르게 작동하는지 확인할 수 있습니다.

Bash 셸로 돌아가려면 exit 명령을 입력합니다.

exit

명령에서 표준 출력이나 오류 메시지가 표시되지 않습니다. sh 셸이 백그라운드 작업으로 시작되고 어떤 종류의 화면 인터페이스 없이 실행되기 때문입니다.

좋든 나쁘든 명령의 모든 출력이 이메일로 전송됩니다. at 명령을 실행하는 사람에게 내부 메일 시스템을 통해 전송됩니다. 즉, 내부 이메일 시스템을 설정하고 구성해야 합니다.

많은(대부분의) Linux 시스템에는 내부 이메일 시스템이 거의 필요하지 않기 때문에 내부 이메일 시스템이 없습니다. 일반적으로 다음과 같은 시스템을 사용하는 사람들은 메일을 보내다 또는 접미사. 시스템에 내부 이메일 시스템이 없는 경우 스크립트가 파일에 쓰도록 하거나 출력을 파일로 리디렉션하여 로깅을 추가할 수 있습니다.

명령이 표준 출력이나 오류 메시지를 생성하지 않으면 어쨌든 이메일을 받지 못합니다. 많은 Linux 명령은 침묵을 통해 성공을 나타내므로 대부분의 경우 이메일을 받지 못합니다.

이제 at에 명령을 입력할 시간입니다. 이 예에서는 *.bak, *.tmp 및 *.o 파일을 삭제하는 Sweep.sh라는 작은 스크립트 파일을 사용합니다. 아래와 같이 명령의 경로를 입력하고 Enter 키를 누릅니다.

그만큼

다른 명령 프롬프트가 나타나고 원하는 만큼 명령을 추가할 수 있습니다. 일반적으로 단일 스크립트에 명령을 포함하고 at 내부에서 해당 스크립트를 호출하는 것이 더 편리합니다.

Ctrl+D를 눌러 명령 추가가 완료되었음을 알립니다. 쇼에서 , 즉 전송의 끝. 아래와 같이 작업 번호와 작업 실행이 예약된 시간이 표시됩니다.

확인

작업이 실행된 후 다음을 입력하여 내부 메일을 확인합니다.

mail

그만큼

메일이 없으면 성공을 가정해야 합니다. 물론 이 경우 *.bak , *.tmp, *.o 파일이 삭제되었는지 확인하여 명령어가 잘 되었는지 확인할 수 있습니다.

전체를 다시 실행하려면 다음을 입력하십시오.

at now + 1 minute

그만큼

1분 후 다음을 입력하여 메일을 다시 확인합니다.

mail

그만큼

이봐, 메일이 왔어! 메시지 번호 1을 읽으려면 1을 누른 다음 Enter 키를 누르십시오.

스크립트의 명령이 오류 메시지를 생성했기 때문에 에서 이메일을 받았습니다. 이 예에서는 이전에 스크립트를 실행할 때 파일을 제거했기 때문에 삭제할 파일이 없었습니다.

D+Enter를 눌러 이메일을 삭제하고 Q+Enter를 눌러 메일 프로그램을 종료합니다.

날짜 및 시간 형식

at과 함께 사용할 수 있는 시간 형식에 관해서는 많은 유연성이 있습니다. 다음은 몇 가지 예입니다.

오전 11시에 실행:

at 11:00 AM

내일 오전 11시에 실행:

at 11:00 AM tomorrow

다음 주 이 날 오전 11시에 실행:

at 11:00 AM next week

이 시간, 오늘, 다음 주에 실행:

at next week

다음주 금요일 오전 11시에 실행:

at 11:00 AM next fri

다음 주 금요일 이 시간에 실행:

at next fri

다음 달 이 날짜 오전 11시에 실행:

at 11:00 AM next month

특정 날짜의 오전 11시에 실행:

at 11:00 AM 3/15/2020

지금부터 30분 실행:

at now + 30 minutes

지금부터 2시간 실행:

at now + 2 hours

내일 이 시간에 실행:

at tomorrow

목요일 이 시간에 실행:

at thursday

오전 12시에 실행:

at midnight

오후 12시에 실행:

at noon

영국인이라면 티타임(오후 4시)에 실행하도록 명령을 예약할 수도 있습니다.

at teatime

작업 대기열 보기

atq 명령을 입력하여 아래와 같이 예약된 작업의 대기열을 볼 수 있습니다.

  소액 거래는 무엇이며 사람들은 왜 그것을 싫어합니까?

에서 출력

대기열의 각 명령에 대해 atq는 다음 정보를 표시합니다.

작업 ID
예정일
예정된 시간
작업이 있는 대기열입니다. 대기열에는 “a”, “b” 등의 레이블이 지정됩니다. at으로 예약하는 일반 작업은 대기열 “a”로 이동하고 일괄 처리로 예약한 작업(이 기사 뒷부분에서 설명)은 대기열 “b”로 이동합니다.
작업을 예약한 사람입니다.

명령줄에서 at 사용

at을 대화식으로 사용할 필요는 없습니다. 명령에서 사용할 수도 있습니다. 이렇게 하면 스크립트 내부에서 더 쉽게 사용할 수 있습니다.

다음과 같이 at으로 명령을 파이프할 수 있습니다.

echo "sh ~/sweep.sh" | at 08:45 AM

안

at에 의해 작업이 수락 및 예약되고 이전과 같이 작업 번호와 실행 날짜가 보고됩니다.

명령 파일과 함께 at 사용

파일에 일련의 명령을 저장한 다음 at에 전달할 수도 있습니다. 이것은 명령의 일반 텍스트 파일일 수 있으며 실행 가능한 스크립트일 필요는 없습니다.

다음과 같은 방법으로 -f(파일) 옵션을 사용하여 파일 이름을 at에 전달할 수 있습니다.

at now + 5 minutes -f clean.txt

안

파일을 다음 위치로 리디렉션하면 동일한 결과를 얻을 수 있습니다.

at now + 5 minutes 

안

Removing Scheduled Jobs from the Queue

To remove a scheduled job from the queue, you can use the atrm command. If you want to see the queue first to find the number of the job you want to remove, you can use atq . Then, use that job number with atrm, as shown below:

atq
atrm 11
atq

작업의 상세 보기를 보는 방법

이전에 언급했듯이 작업을 훨씬 더 먼 미래로 예약할 수 있습니다. 때로는 일이 무엇을 해야 하는지 잊어버릴 수도 있습니다. atq 명령은 대기열에 있는 작업을 표시하지만 수행할 작업은 표시하지 않습니다. 작업에 대한 자세한 보기를 보려면 -c(cat) 옵션을 사용할 수 있습니다.

먼저 atq를 사용하여 작업 번호를 찾습니다.

atq

에서 출력

이제 -c 옵션과 함께 작업 번호 13을 사용합니다.

at -c 13

그만큼

다음은 작업에 대해 얻은 정보를 분석한 것입니다.

첫 번째 줄: 이것은 명령이 sh 쉘에서 실행될 것임을 알려줍니다.
두 번째 줄: 명령이 1000의 사용자 및 그룹 ID로 실행되는 것을 봅니다. 이들은 at 명령을 실행한 사람의 값입니다.
세 번째 줄: 이메일을 받는 사람이 참석합니다.
네 번째 줄: 사용자 마스크 22입니다. 이것은 이 sh 세션에서 생성된 모든 파일에 대한 기본 권한을 설정하는 데 사용되는 마스크입니다. 마스크는 666에서 빼면 644가 됩니다(8진수는 rw-r--r--).
나머지 데이터: 대부분은 환경 변수입니다.

에서 출력

테스트 결과. 테스트는 실행 디렉토리에 액세스할 수 있는지 확인합니다. 그렇지 않으면 오류가 발생하고 작업 실행이 중단됩니다.
실행할 명령입니다. 이러한 항목이 나열되고 예약된 스크립트의 내용이 표시됩니다. 위 예제의 스크립트는 Bash에서 실행되도록 작성되었지만 여전히 sh 쉘에서 실행됩니다.

일괄 명령

일괄 명령 유사하게 작동 at 명령에 대한 세 가지 중요한 차이점이 있습니다.

배치 명령은 대화식으로만 사용할 수 있습니다.
특정 시간에 실행되도록 작업을 예약하는 대신 대기열에 추가하면 시스템의 평균 로드가 1.5 미만일 때 배치 명령이 작업을 실행합니다.
위의 이유로 배치 명령으로 날짜와 시간을 지정하지 않습니다.

배치 명령을 사용할 때 다음과 같이 명령줄 매개변수 없이 이름으로 호출합니다.

batch

그만큼

다음으로 at 명령과 마찬가지로 작업을 추가합니다.

at 명령에 대한 액세스 제어

at.allow 및 at.deny 파일은 at 계열의 명령을 사용할 수 있는 사람을 제어합니다. 이들은 /etc 디렉토리에 있습니다. 기본적으로 at.deny 파일만 존재하며 at이 설치될 때 생성됩니다.

작동 방식은 다음과 같습니다.

at.deny: at을 사용하여 작업을 예약할 수 없는 응용 프로그램 및 엔터티를 나열합니다.
at.allow: at을 사용하여 작업을 예약할 수 있는 사람을 나열합니다. at.allow 파일이 없으면 at은 at.deny 파일만 사용합니다.

기본적으로 누구나 at을 사용할 수 있습니다. 사용할 수 있는 사람을 제한하려면 at.allow 파일을 사용하여 사용할 수 있는 사람을 나열합니다. at.deny 파일에 at을 사용할 수 없는 모든 사람을 추가하는 것보다 쉽습니다.

at.deny 파일은 다음과 같습니다.

sudo less /etc/at.deny

그만큼

이 파일은 at을 사용할 수 없는 운영 체제의 구성 요소를 나열합니다. 이들 중 대부분은 보안상의 이유로 금지되어 있으므로 파일에서 제거하고 싶지 않습니다.

이제 at.allow 파일을 편집합니다. 우리는 dave와 mary를 추가할 것이지만 다른 사람은 에서 사용할 수 없습니다.

먼저 다음을 입력합니다.

sudo gedit /etc/at.allow

그만큼

에디터에서 아래와 같이 두 개의 이름을 추가한 후 파일을 저장합니다.

다른 사람이 at을 사용하려고 하면 권한이 없다는 메시지가 표시됩니다. 예를 들어 eric이라는 사용자가 다음을 입력한다고 가정해 보겠습니다.

at

그는 아래와 같이 거절될 것입니다.

다시 말하지만, eric은 at.deny 파일에 없습니다. at.allow 파일에 누군가를 넣는 즉시 그 밖의 모든 사람은 at.allow 파일을 사용할 수 있는 권한이 거부됩니다.

일회용에 적합

보시다시피 at과 batch는 모두 한 번만 실행해야 하는 작업에 이상적입니다. 다시 한 번 빠른 검토로:

정규 프로세스가 아닌 작업을 수행해야 하는 경우 at으로 일정을 잡습니다.
시스템 부하가 충분히 낮을 때만 작업을 실행하려면 일괄 처리를 사용합니다.