리눅스 팁: cron과 at를 사용한 작업 일정 관리 (한글) 정보
Linux 리눅스 팁: cron과 at를 사용한 작업 일정 관리 (한글)본문
시스템 사용량이 적어진 한밤중에 작업을 실행할 필요가 있거나 일일이나 주간 단위로 작업을 수행할 필요가 있지만, 잠도 자야겠고 다른 활동도 하면서 삶을 즐기고 싶습니다. 작업 일정 관리가 필요한 또 다른 좋은 이유는 반복적인 과업을 자동으로 수행하도록 만들거나 매번 동일한 방식으로 과업을 수행하도록 만들고 싶기 때문입니다. 여기서 소개하는 팁은 주기적으로나 일회성으로 미래 작업 일정을 관리하는cron
과at
기능을 활용하도록 도와줍니다.
리눅스(Linux?)와 유닉스(UNIX?) 시스템은 일회성이거나 반복적인 미래 작업 일정을 관리하도록 만들어준다. LPI exam 102 prep: Administrative tasks에서 발췌한 이번 기사에서는 주기적으로 작업 일정을 관리하는 방법과 미래에 작업을 수행하는 방법을 보여준다.
많은 시스템 관리 작업은 리눅스 시스템에서 종종 주기적으로 수행해야만 한다. 이런 작업에는 로그 파일을 회전시켜서 파일 시스템이 가득 차지 않도록 만들기, 자료 백업하기, 시스템 시각을 동기화하기 위한 서버 연결과 같은 작업을 포함한다. 이런 관리 작업에 대한 세부 사항은 위에서 언급한 튜토리얼을 참조하기 바란다. 이번 팁에서는 리눅스에서 사용 가능한 작업 일정 관리 패키지인 cron
, crontab
, anacron
, at
명령을 다룬다. 시스템이 잠들거나 꺼져 있더라도, anancron
은 다음 번에 깨어날 때 작업을 따라잡도록 도와준다.
주기적으로 작업을 수행하려면 어떤 작업을 어느 주기로 수행해야 하는지 기술하는 테이블 집합과 crond
데몬을 포함하는 cron 명령군으로 관리한다. 데몬은 매 분 깨어나서 crontab을 점검해 수행할 작업을 결정한다. 사용자는 crontab
명령을 사용해 crontab
을 관리한다. crond
데몬은 일반적으로 시스템 시동 과정에서 init
프로세스가 시작한다.
설명을 간단하게 진행하기 위해, Listing 1에 나와 있는 명령을 정기적으로 실행하기 원한다고 가정하자. 이 명령은 실제로 날짜와 시각 보고 이외에는 특별한 일을 하지 않지만, cron 작업을 설정하기 위해 crontab
을 사용하는 방법을 설명해 주며, 언제 실행해 출력이 나오는지 확인하기도 쉽다. crontab 항목 설정 작업은 셸 메타 문자를 회피한 문자열을 요구하므로 간단한 명령과 매개변수로 만드는 편이 좋다. 이번 예제에서는 /home/ian/mycrontab.sh라는 스크립트 내부에서 매개변수를 붙이지 않은 echo
명령이 실행될 것이다. 이렇게 하면 메타 문자를 회피하느라 신경 쓸 필요가 없다.
Listing 1. 간단한 명령어 예제
[ian@lyrebird ~]$ cat mycrontest.sh #!/bin/bash echo "It is now $(date +%T) on $(date +%A)" [ian@lyrebird ~]$ ./mycrontest.sh It is now 18:37:42 on Friday |
crontab을 만들려면 crontab
명령에 -e
("edit") 옵션을 붙이면 된다. 이렇게 명령을 내리면 EDITOR나 VISUAL 환경 변수에 다른 편집기를 지정하지 않은 이상 vi
편집기가 열린다.
각 crontab 항목은 6개 필드로 이뤄진다.
- 분
- 시
- 월 중 특정 일
- 년 중 특정 달
- 주 중 특정 일
sh
가 실행할 문자열
분과 시는 각각 0-59와 0-12 범위에 들어야 하며, 달 중 일과 년 중 달은 각각 1-31, 1-12 범위에 들어야 한다. 주 중 일은 0-6까지 범위에 들어야 하는데 0이 일요일이다. 주 중 일은 또한 sun, mon, tue와 같이 지정도 가능하다. 여섯 번째 필드는 다섯 번째 필드 이후에 이어지는 모든 내용을 포괄하며, sh에 전달할 문자열로 해석한다. % 기호는 개행문자로 해석하므로 %나 다른 특별한 문자를 사용하고 싶다면 역슬래시(\)를 앞에 붙여야 한다. 첫 %까지 이어지는 내용은 셸에 전달되며, % 이후에 이어지는 내용은 표준 입력으로 전달된다.
시각과 관련한 다양한 필드는 개별 값이나 0-10이나 sun-wed와 같은 값 범위, 개별 값과 범위를 쉼표로 구분한 목록으로 지정할 수 있다. 예제를 위해 조금 인위적으로 꾸민 crontab 항목을 Listing 2에 나오는 예제에서 소개한다.
Listing 2. 간단한 crontab 예제
0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh |
이 예제를 살펴보면 7월 중 금요일과 토요일 10시부터 자정 사이에 (매 20분) 0분, 20분, 40분이 되면 명령을 수행한다. crontab(5)를 위한 매뉴얼 페이지를 참조해 시각 지정에 대한 세부 사항을 살펴보기 바란다.
명령 결과가 어디로 출력될지 궁금할 것이다. cron 명령군과 연계되어 돌아가는 대다수 명령어는 LPI exam 102 prep: Administrative tasks에서 설명한 syslog 기능을 사용해 결과물을 출력한다. 하지만 표준 출력으로 나가는 수행 결과는 사용자에게 전자편지로 전달될 것이다. Listing 3은 예제 명령에서 받을 결과물을 보여준다.
Listing 3. 전자편지로 전달된 cron 출력 결과
From *** 개인정보보호를 위한 이메일주소 노출방지 *** Fri Jul 6 23:00:02 2007 Date: Fri, 6 Jul 2007 23:00:01 -0400 From: *** 개인정보보호를 위한 이메일주소 노출방지 *** (Cron Daemon) To: *** 개인정보보호를 위한 이메일주소 노출방지 *** Subject: Cron <ian@lyrebird> /home/ian/mycrontest.sh Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/home/ian> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=ian> X-Cron-Env: <USER=ian> It is now 23:00:01 on Friday |
![]() |
|
crontab 명령으로 만든 crontab
은 /etc/spool/cron 디렉터리에 생성한 사용자 이름으로 저장된다. 따라서 위에서 만든 crontab
은 /etc/spool/cron/ian에 저장된다. 이런 결과를 놓고 보면 crontab
이 passwd
명령과 유사하게 루트 권한으로 동작하는 suid 프로그램이라는 사실이 그리 놀랍지 않다.
사용자 crontab 파일이 /var/spool/cron에 저장되는 경우와 별개로, cron
은 또한 /etc/crontab과 /etc/cron.d 디렉터리에 속한 파일을 점검한다. 이런 시스템 crontab은 다섯 번째 시각 항목(day)과 명령 사이에 추가 필드가 하나 더 들어간다. 이 추가 필드는 명령어를 수행할 사용자를 지정하는데 보통 root다. /etc/crontab은 Listing 4에 나온 예제와 비슷하다.
Listing 4. /etc/crontab
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly |
이 예제에서 실제 작업은 run-parts
명령이 담당하며 /etc/cron.hourly, /etc/cron.daily 등에서 스크립트를 수행한다. /etc/crontab은 단순히 반복적인 작업 타이밍을 통제할 뿐이다. 여기서 소개한 명령어는 모두 root로 동작함에 주의하자. 또한 crontab은 명령어 실행 전에 설정해야 할 셸 변수를 대입할 수 있다는 사실도 눈여겨보자.
cron 명령군은 끊임없이 동작해야 하는 시스템에 적합하다. 랩톱과 같이 대다수 시간 동안 꺼져 있어야 하는 시스템에는 anacron("anachronistic cron")이라는 또 다른 명령군이 cron 명령군이 일일, 주간, 월간으로 수행하는 일반적인 작업 일정을 관리한다. anacron은 시간별 작업을 다루지는 않는다.
anacron은 /var/spool/anacron에 작업이 시작할 때를 기록한 타임스탬프 파일을 유지한다. anacron이 동작할 때, 작업이 마지막으로 수행해 흘러간 날짜를 살펴 필요하다면 작업을 수행한다. anacron용 작업 테이블은 /etc/anacrontab에 저장되어 있는데, /etc/crontab과는 형식이 조금 다르다. /etc/crontab과 마찬가지로 /etc/anacrontab은 환경 설정을 포함할 수 있다. 각 작업마다 다음과 같은 필드 넷이 따라온다.
- 기간
- 지연
- 작업 식별자
- 명령
기간은 날짜로 세지만, 한달에 한번 작업을 실행할 경우에는 그 달에 속한 날짜에 무관하게 @monthly라고 명시할 수 있다. 지연은 작업이 끝나고 대기해야 하는 기간을 분 단위로 나타낸다. 시스템이 처음 시작할 때 엄청나게 많은 작업이 동시에 경쟁하지 못하도록 지연을 활용한다. 작업 식별자는 슬래시를 제외한 공백이 아닌 문자를 포함할 수 있다.
/etc/crontab과 /etc/anacrontab은 직접 편집으로 수정이 가능하다. 이 파일이나 /etc/cron.d 디렉터리에 위치한 파일을 수정할 경우에는 crontab
명령을 사용하지 않는다.
![]() |
![]()
|
종종 작업을 주기적이 아니라 단지 한번만 실행하고 싶을 경우가 있다. 이를 위해 at
명령을 사용한다. at 명령은 -f
옵션으로 지정한 파일을 읽어들이거나 -f
를 사용하지 않을 경우 표준 출력에서 실행할 명령을 챙긴다. -m
옵션은 명령에서 표준 출력으로 결과가 나오지 않을 경우에도 사용자에게 전자편지를 보낸다. -v
옵션은 작업을 읽기 앞서 어떤 작업을 수행할지 시각을 표시한다. 시각은 또한 출력 과정에서 표시된다.
Listing 5는 직전에 사용했던 mycrontest.sh
스크립트를 실행한 예제다. Listing 6은 작업을 실행한 다음에 사용자에게 전자편지로 보낸 결과물을 보여준다. cron 작업에서 나온 동일한 결과에 비해 훨씬 더 간단함에 주목하자.
Listing 5. at 명령 사용하기
[ian@lyrebird ~]$ at -f mycrontest.sh -v 10:25 Sat Jul 7 10:25:00 2007 job 5 at Sat Jul 7 10:25:00 2007 |
Listing 6. at에서 나온 작업 결과물
From *** 개인정보보호를 위한 이메일주소 노출방지 *** Sat Jul 7 10:25:00 2007 Date: Sat, 7 Jul 2007 10:25:00 -0400 From: Ian Shields <*** 개인정보보호를 위한 이메일주소 노출방지 ***> Subject: Output from your job 5 To: *** 개인정보보호를 위한 이메일주소 노출방지 *** It is now 10:25:00 on Saturday |
시각 명세는 상당히 복잡하다. Listing 7에 몇 가지 예를 들어 놓았다. 매뉴얼 페이지에서 at
를 찾아보거나 /usr/share/doc/at/timespec이나 /usr/share/doc/at-3.1.10/timespec을 읽어보자. 여기서 3.1.10은 이 기사에서 사용한 at
패키지 버전이다.
Listing 7. at 명령어에 사용하는 시각 값
[ian@lyrebird ~]$ at -f mycrontest.sh 10pm tomorrow job 14 at Sun Jul 8 22:00:00 2007 [ian@lyrebird ~]$ at -f mycrontest.sh 2:00 tuesday job 15 at Tue Jul 10 02:00:00 2007 [ian@lyrebird ~]$ at -f mycrontest.sh 2:00 july 11 job 16 at Wed Jul 11 02:00:00 2007 [ian@lyrebird ~]$ at -f mycrontest.sh 2:00 next week job 17 at Sat Jul 14 02:00:00 2007 |
![]() |
|
at
명령어에는 또한 큐를 지정하는 -q
옵션이 있다. 큐 이름이 뒤로 갈수록 작업을 위한 nice
값 역시 증가한다. 또한 batch
명령어도 있는데, at
명령어와 비슷하지만 시스템 부하가 충분히 낮을 때만 작업을 수행한다는 차이점이 있다. 이런 기능에 대한 세부 사항은 매뉴얼 페이지를 참조하자.
![]() |
![]()
|
cron과 at 작업을 관리할 수 있다. crontab
명령어에 -l
옵션을 붙이면 crontab에 들어있는 목록을 출력하며, atq
명령을 내리면 at
명령을 사용해 큐에 넣은 작업을 표시한다. Listing 8을 참조하자.
Listing 8. 일정이 걸린 작업 표시하기
[ian@lyrebird ~]$ crontab -l 0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh [ian@lyrebird ~]$ atq 16 Wed Jul 11 02:00:00 2007 a ian 17 Sat Jul 14 02:00:00 2007 a ian 14 Sun Jul 8 22:00:00 2007 a ian 15 Tue Jul 10 02:00:00 2007 a ian |
at
으로 수행하기를 원하는 실제 명령을 검토하길 원한다면 -c
옵션과 작업 번호를 붙여 at
명령을 내리면 된다. at
명령어를 내린 시점에서 활성화된 환경 대다수가 일정이 걸린 작업과 함께 저장되었음을 알 수 있다. Listing 9는 Listing 7과 Listing 8에서 보여준 작업 15의 결과를 일부 보여준다.
Listing 9. at 명령에 -c 옵션과 작업 번호를 넘기기
#!/bin/sh # atrun uid=500 gid=500 # mail ian 0 umask 2 HOSTNAME=lyrebird.raleigh.ibm.com; export HOSTNAME SHELL=/bin/bash; export SHELL HISTSIZE=1000; export HISTSIZE SSH_CLIENT=9.67.219.151\ 3210\ 22; export SSH_CLIENT SSH_TTY=/dev/pts/5; export SSH_TTY USER=ian; export USER ... HOME=/home/ian; export HOME LOGNAME=ian; export LOGNAME ... cd /home/ian || { echo 'Execution directory inaccessible' >&2 exit 1 } ${SHELL:-/bin/sh} << `(dd if=/dev/urandom count=200 bs=1 \ 2>/dev/null|LC_ALL=C tr -d -c '[:alnum:]')` #!/bin/bash echo "It is now $(date +%T) on $(date +%A)" |
여기서 만든 스크립트 파일 내용은 SHELL 환경 변수가 지정한 셸이나 SHELL 환경 변수가 없다면 /bin/sh가 수행할 내용을 히어-도큐멘트(here-document) 형식으로 복사한다는 사실에 주목하자. 히어-도큐멘트(here-document)에 대한 정보가 더 필요하면 LPI exam 101 prep, Topic 103: GNU and UNIX commands를 읽어보기 바란다.
Listing 10에 나온 -r
옵션으로 cron
명령을 내리면 일정이 걸린 모든 cron 작업을 삭제할 수 있다.
Listing 10. cron 작업 출력과 삭제
[ian@lyrebird ~]$ crontab -l 0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh [ian@lyrebird ~]$ crontab -r [ian@lyrebird ~]$ crontab -l no crontab for ian |
시스템 cron이나 anacron 작업을 삭제하려면 /etc/crontab, /etc/anacrontab을 편집하거나 /etc/cron.d 디렉터리에서 파일을 삭제한다.
at
명령어로 일정이 걸린 파일을 하나 이상 삭제하려면 작업 번호를 붙여 atrm
명령을 내린다. 여러 작업을 지우려면 작업 번호 사이에 공백이 필요하다. Listing 11에 예를 정리했다.
Listing 11. atq와 atrm으로 작업 출력과 삭제
[ian@lyrebird ~]$ atq 16 Wed Jul 11 02:00:00 2007 a ian 17 Sat Jul 14 02:00:00 2007 a ian 14 Sun Jul 8 22:00:00 2007 a ian 15 Tue Jul 10 02:00:00 2007 a ian [ian@lyrebird ~]$ atrm 16 14 15 [ian@lyrebird ~]$ atq 17 Sat Jul 14 02:00:00 2007 a ian |
![]() |
![]()
|
/etc/cron.allow 파일이 있으면 루트가 아닌 사용자가 crontab
cron 기능을 사용하기 위해서는 반드시 이 파일에 계정이 올라 있어야 한다. /etc/cron.allow 파일이 존재하지 않지만 /etc/cron.deny 파일이 존재한다면, 이 파일에 계정이 올라가 있는 루트가 아닌 사용자는 crontab
이나 cron 기능을 사용할 수 없다. 두 파일 모두 존재하지 않으면, 단지 슈퍼 유저만이 이 명령을 사용하도록 허용한다. 비어있는 /etc/cron.deny 파일은 cron 기능을 모든 사용자에게 열어주는데 기본 설정이기도 하다.
/etc/cron.allow와 /etc/cron.deny에 각각 대응하는 /etc/at.allow와 /etc/at.deny 파일은 at 기능을 위해 비슷한 효과를 발휘한다.
출처 : 한국IBM
출처 : Tong - 難攻不落님의 기본통
4
댓글 2개

at 으로는 원하는 시간대에 실행하도록 하는데요.
새벽 시간대 꼭 실행해달라는 고객이 있는데 정망 유용한 것 같아요.^^