리눅스 팁: cron과 at를 사용한 작업 일정 관리 (한글) > 개발자팁

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.

리눅스 팁: cron과 at를 사용한 작업 일정 관리 (한글) 정보

Linux 리눅스 팁: cron과 at를 사용한 작업 일정 관리 (한글)

본문

시스템 사용량이 적어진 한밤중에 작업을 실행할 필요가 있거나 일일이나 주간 단위로 작업을 수행할 필요가 있지만, 잠도 자야겠고 다른 활동도 하면서 삶을 즐기고 싶습니다. 작업 일정 관리가 필요한 또 다른 좋은 이유는 반복적인 과업을 자동으로 수행하도록 만들거나 매번 동일한 방식으로 과업을 수행하도록 만들고 싶기 때문입니다. 여기서 소개하는 팁은 주기적으로나 일회성으로 미래 작업 일정을 관리하는 cronat 기능을 활용하도록 도와줍니다.

리눅스(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을 만들려면 crontab 명령에 -e("edit") 옵션을 붙이면 된다. 이렇게 명령을 내리면 EDITOR나 VISUAL 환경 변수에 다른 편집기를 지정하지 않은 이상 vi 편집기가 열린다.

각 crontab 항목은 6개 필드로 이뤄진다.

  1. 월 중 특정 일
  2. 년 중 특정 달
  3. 주 중 특정 일
  4. 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은 어디에?

suid 프로그램

suid 프로그램은 프로그램을 돌리는 사용자 권한이 아닌 프로그램 파일의 소유자 권한으로 동작한다. LPI exam 101 prep: 장치, 리눅스 파일시스템, Filesystem Hierarchy Standard (한글)을 보면 suid에 대한 더 많은 정보가 나오며, LPI exam 102 prep: Administrative tasks를 보면 passwd 명령에 대해 더 많은 정보가 나온다.

crontab 명령으로 만든 crontab은 /etc/spool/cron 디렉터리에 생성한 사용자 이름으로 저장된다. 따라서 위에서 만든 crontab은 /etc/spool/cron/ian에 저장된다. 이런 결과를 놓고 보면 crontabpasswd 명령과 유사하게 루트 권한으로 동작하는 suid 프로그램이라는 사실이 그리 놀랍지 않다.

/etc/crontab

사용자 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은 명령어 실행 전에 설정해야 할 셸 변수를 대입할 수 있다는 사실도 눈여겨보자.

Anacron

cron 명령군은 끊임없이 동작해야 하는 시스템에 적합하다. 랩톱과 같이 대다수 시간 동안 꺼져 있어야 하는 시스템에는 anacron("anachronistic cron")이라는 또 다른 명령군이 cron 명령군이 일일, 주간, 월간으로 수행하는 일반적인 작업 일정을 관리한다. anacron은 시간별 작업을 다루지는 않는다.

anacron은 /var/spool/anacron에 작업이 시작할 때를 기록한 타임스탬프 파일을 유지한다. anacron이 동작할 때, 작업이 마지막으로 수행해 흘러간 날짜를 살펴 필요하다면 작업을 수행한다. anacron용 작업 테이블은 /etc/anacrontab에 저장되어 있는데, /etc/crontab과는 형식이 조금 다르다. /etc/crontab과 마찬가지로 /etc/anacrontab은 환경 설정을 포함할 수 있다. 각 작업마다 다음과 같은 필드 넷이 따라온다.

  1. 기간
  2. 지연
  3. 작업 식별자
  4. 명령

기간은 날짜로 세지만, 한달에 한번 작업을 실행할 경우에는 그 달에 속한 날짜에 무관하게 @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

nice로 친절해지기

작업에 대한 nice 값은 다른 사용자에게 얼마나 친절한지를 나타내는 척도다. LPI exam 101 prep: GNU and UNIX commands를 읽어보면 nicerenice에 대해 더 많은 정보가 나온다.

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 기능을 위해 비슷한 효과를 발휘한다.

 

필자소개

Ian Shields 사진

Ian Shields는 developerWorks 리눅스 영역을 위한 리눅스 프로젝트 다수를 수행하고 있다. Shields는 노스 캐롤라이나 주 소재 IBM 리서치 트라이앵글 파크에서 선임 프로그래머로 일한다. Shields는 1973년 시스템 엔지니어로 오스트레일리아, 캔베라에 있는 IBM 사무실에 들어갔으며 캐나다 몬트리얼과 노스 캐롤라이나 주 RTP에서 통신 시스템과 배포 컴퓨팅 부문에서 일해왔다. Shields는 특허 여러 건을 획득했으며, 논문 여러 건을 발표했다. Shields는 순수 수학과 철학 학사 학위를 오스트레일리안 국립 대학에서 받았다. 노스 캐롤라이나 주립 대학에서 컴퓨터 과학 분야를 대상으로 석사와 박사 학위를 받았다. 전자편지 주소는 이다.

 

출처 : 한국IBM

출처 : Tong - 難攻不落님의 기본통

[이 게시물은 관리자님에 의해 2011-10-31 17:32:05 Linux에서 이동 됨]
추천
4
  • 복사

댓글 2개

저도 cron , at 정말 많이 사용합니다.

at 으로는 원하는 시간대에 실행하도록 하는데요.

새벽 시간대 꼭 실행해달라는 고객이 있는데 정망 유용한 것 같아요.^^
© SIRSOFT
현재 페이지 제일 처음으로