-
cron, crontab - 작업 예약 명령서버 2016. 1. 23. 22:58
개요
cron(크론)은 원하는 시간에 명령(프로그램)을 시키기 위한 데몬입니다. 서버는 늘 깨어있다는 것을 이용한 최대한의 활용법입니다. cron을 사용하는 이유는 사람이 직접 서버에서 특정 작업을 매일 할 수 없기 때문입니다. 예를 들어, 새벽 3시에 매일 서버에서 작업을 해야하는 경우나, 30분 간격으로 CPU 사용량을 운용자에게 알리는 경우 사람이 직접 하는 것에 한계가 있어 cron을 사용하게 됩니다. cron은 항상 지정한 시간이 되었는지 확인하면서 해당 명령어를 실행합니다.
동작원리
crontab은 멀티쓰레드 환경으로 동작하지 않습니다(아마도). 모든 cron은 하나의 작업 또는 다른 작업을 실행할 시간이 될 때까지 시간을 간결하게 표현하는 작업을 수행해야 합니다. 그렇다면 해당 작업을 실행하는 프로세스를 포크하고 작업이 완료되었는지 주기적으로 확인하여 정리해야만 합니다. 멀티쓰레드 환경이 이러한 대기환경을 위해 사용될 수는 있지만 배보다 배꼽이 더 크다고 생각합니다. wait () / waitpid() 함수를 사용하면 즉시 모든 자식 프로세스들를 볼 수 있습니다 . 차단하지 않고도 한눈에 확인할 수 있으므로 다음 작업을 실행할 시간을 계속 찾고 있을 가능성이 있습니다. 그리고 SIGCHLD도 존재합니다.
설정방법
cron 설정 자체는 /etc/crontab에서 합니다. 사용자는 해당 파일에 실행하고자 하는 프로세스를 간편하게 아래와 같은 옵션을 사용하여 추가, 삭제 등을 할 수 있습니다.
옵션
$ crontab -e # 설정된 파일을 새롭게 편집 - 맨 처음에 사용할 편집기를 고를 수 있음 $ crontab -d # 등록된 내용을 삭제 $ crontab -l # 현재 등록된 리스트 출력 $ crontab -l -u otheruser # otheruser 사용자가 등록한 crontab 리스트 출력 $ crontab -r # 현재 사용자가 등록한 crontab 전체 삭제
crontab -e로 프로세스를 추가, 삭제 및 수정을 하고 저장하고 에디터 창을 빠져나가면 바로 적용이 됩니다.
crontab에 적용된 리스트가 없을 경우 아래와 같은 문구가 출력됩니다.
$ crontab -l no crontab for root
사용자 허용 및 거부
특정 사용자가 crontab을 사용하지 못하게 할 경우나 사용하게 하고 싶은 경우 아래와 같이 수정합니다.
$ vi /etc/cron.allow # 허용할 사용자 ID 추가 $ vi /etc/cron.deny # 거부할 사용자 ID 추가
파일형식
필드 의미 범위 첫번째 분 0~59 두번째 시 0~23 세번째 일 0~31 네번째 월 1~12 다섯번째 요일 0~7 (0 또는 7 일요일, 1= 월요일, 2=화요일, ...) 여섯번째 명령어 실행할 명령어를 한줄로 작성 표현필드
문자 의미 예시 * 해당 필드의 모든 시간을 의미 * * * * * ./test.sh
매일, 매시 1분단위로 test.sh를 실행 (하루에 1440회)
콤마(,) 여러 시간대를 지정할 수 있음 10,20 * * * * ./test.sh
매일, 매시 10분, 20분 마다 test.sh를 실행 (하루에 48회)
하이픈(-) 시간을 범위로 지정할 수 있음 * * * 3-5 * ./test.sh
3월~5월까지 매시간 매분에 test.sh를 실행
슬래쉬(/) 시간의 간격을 지정할 수 있음 */10 * * * * ./test.sh
10분마다 test.sh를 실행
주의점
- 한 줄당 하나의 명령 (두 줄로 나눠서 표시할 수 없음)
- 주석처리는 실행되지 않음 (당연)
- 모든 엔트리 필드는 공백으로 구분
한 줄로 여러 명령을 실행하고자 하면 쉘스크립트를 만들어 해당 스크립트 파일을 실행 하던지 다중 명령어인 &&를 사용해야 합니다.
예시
crontab -e를 치고 에디터를 고르면 (아래는 vi) 다음과 같은 화면을 볼 수 있습니다.
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command
위 화면에 아래와 같은 예시들을 추가한 다음 저장하면 crontab 설정이 자동으로 등록됩니다.
* * * * * /root/cronTest.class # 매 1분마다 /root/cronTest.class를 수행 (하루에 1440회) 15,45 * * * * /root/cronTest.class # 매시 15분, 45분에 /root/cronTest.class를 수행 (하루에 48회) */10 * * * * /root/cronTest.class # 10분마다 /root/cronTest.class를 수행 (하루에 144회) 0 2 * * * /root/cronTest.class # 매일 02:00에/root/cronTest.class를 수행 (하루에 1회) 30 */6 * * * /root/cronTest.class # 매 6시간마다 수행(00:30, 06:30, 12:30, 18:30) 30 1-23/6 * * * /root/cronTest.class # 1시부터 매 6시간마다 수행(01:30, 07:30, 13:30, 19:30)
로그
보통 crontab의 로그는 /var/log/cron 위치에 존재하지만 우분투 14.04 LTS의 경우는 해당 위치에 존재하지 않습니다. /var/log/syslog 위치에 crontab의 로그가 존재합니다. 좀더 편하게 보는 방법은 sudo tail -F /var/log/syslog의 명령어를 사용하여 실시간으로 확인할 수 있습니다.
$ sudo tail -F /var/log/syslog Dec 20 15:04:29 DEV-F1-SERVICE-001 kernel: [705029.840187] IN= OUT=eth0 SRC=172.16.114.69 DST=91.189.95.15 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=61267 DF PROTO=TCP SPT=55124 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=0 Dec 20 15:05:01 DEV-F1-SERVICE-001 CRON[27732]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1) Dec 20 15:07:22 DEV-F1-SERVICE-001 crontab[27756]: (test) LIST (test) Dec 20 15:09:19 DEV-F1-SERVICE-001 crontab[27786]: (test) DELETE (test) Dec 20 15:09:23 DEV-F1-SERVICE-001 crontab[27787]: (test) LIST (test) Dec 20 15:12:19 DEV-F1-SERVICE-001 crontab[27818]: (test) BEGIN EDIT (test) Dec 20 15:12:34 DEV-F1-SERVICE-001 crontab[27818]: (test) REPLACE (test) Dec 20 15:12:34 DEV-F1-SERVICE-001 crontab[27818]: (test) END EDIT (test) Dec 20 15:15:01 DEV-F1-SERVICE-001 CRON[27847]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1