crontab 사용법과 예제

문법

*   *   *   *   *  $(BASH COMMAND)
┬   ┬   ┬   ┬   ┬
│   │   │   │   │
│   │   │   │   │
│   │   │   │   └───────── 요일 (0~6) (0:일요일, 1:월요일  ...  5:금요일, 6:토요일)
│   │   │   └────────── 월 (1~12)
│   │   └─────────── 일 (1~31)
│   └──────────── 시 (0~23)
└───────────── 분 (0~59)
  • /etc/crontab 을 열어서 어떤식으로 사용하는지 확인할수있다.

범위 지정에 사용할 수 있는 연산자

1.  * 
해당 범위 모두 수행하게 된다.
예를 들어 매분 마다 실행되게 하고 싶다. -> * * * * *
매 시간 정각에 실행되게 하고 싶다. -> 0 * * * * 
매 일 오전 03시에 실행되게 하고 싶다 -> 0 3 * * *
매 달 25일 자정에 실행되게 하고 싶다 -> 0 0 25 * *
매 해 1월 1일 오후 2시에 실행되게 하고 싶다 -> 0 14 1 1 *
매 주 화요일 오전 03시 30분에 실행되게 하고 싶다. -> 30 3 * * 2

2.  - 
해당 구간은 모두 수행하게 된다.
문서 인쇄를 할 때 2페이지부터 7페이지까지만 인쇄하고 싶을 때 2-7을 사용하는 것과 같은 원리로 사용할 수 있다.
매 시간 10분에서 30분까지 매 분마다 실행되게 하고 싶다 -> 10-30 * * * *
오후 7시에서 11시까지 매 시간마다 실행되게 하고 싶다 -> 0 7-11 * * *
매 월 20일에서 28일까지 자정에 실행되게 하고 싶다 -> 0 0 20-28 * *
매 해 3월에서 6월까지 1일 오전 03시 30분에 실행되게 하고 싶다 -> 30 3 1 3-6 *
평일 오전 03시에만 실행되게 하고 싶다 -> 0 3 * * 1-5 

3.  ,
특정 시간대에만 수행하게 된다.
10분, 30분 -> 10, 30 * * * *
오전 4시 오후 4시 정각 -> 0 4, 16 * * *
매 월 1일 15일 자정 -> 0 0 1, 15 * *
매 년 5월 11월 1일 정오 -> 0 12 1 5,11 *
월, 수, 금 오후 2시 30분 -> 30 2 * * 2,4,6

4.  /
주기적으로 호출한다.
*/5 * * * *  -> 매 시간 5분 마다 실행
0 */2 * * * -> 매 2시간마다 정각에 실행

crontab에 등록해보자.

일단 cron 데몬이 커널에 올라가 있는지 확인해보자.

ps -ef | grep cron

아래 처럼 실행이 되고 있다. 만약 실행되지 않는다면 /etc/init.d/crond start 하면된다.

crontab -l 로 리스트를 확인하고

crontab -e 로 vi 처럼 입력하면 된다.

입력을 마치고 wq로 저장 종료 후

/etc/init.d/crond restart 로 재실행하면 등록 끝!

예제

예제 1(프로세스 관리하기)

  • 아래처럼 쉘파일 만들기
#!/bin/sh
MYPROC="/path/to/process -i options"

/usr/bin/pgrep  -f  -x  "$MYPROC"  >  /dev/null  2>&1  ||  $MYPROC
위와 같이 작성하고 myproc.sh 이라는 이름으로 저장합니다. 
위 스크립트는 MYPROC에 정의된 프로세스가 있는지 pgrep으로 확인하고 없으면
 MYPROC을 실행하여 프로세스를 실행하게 됩니다. 
pgrep의 -f -x 옵션은 프로세스 이름을 대조할 때 전체(-f, full)를 사용하고 
정확해야(-x, exact)함을 지시합니다.

"/dev/null" 2>&1 구문은 stderr(2) 출력을 stdout(1)로 보내라는 의미이며, 
이것을 null 디바이스로 보내 표준출력으로 나오는 메시지들을 무시하게 됩니다. 
관리하는 프로세스가 별도의 로그파일 기록 기능이 있다면 이렇게 처리해주면 됩니다.

스크립트에서 "||" 연산자는 앞에서 수행한 커맨드의 리턴값이 0이 아니면 
(즉 실패라면) || 뒤의 명령을 실행하라는 겁니다. 
만일 프로세스가 죽어 있다면 pgrep의 결과는 실패여서 0이 아닌 값이 나올 것이고,
 그러면 || 뒤의 명령을 실행하게 되는 겁니다. ||과 반대되는 역할은 && 연산자입니다.

만일 관리하는 프로세스가 여러개라면 위의 쉘 스크립트에 같은 방식으로 계속 추가하면 됩니다

  • “crontab -e”를 실행하여 다음과 같이 스케쥴을 등록합니다.
*  *  *  *  *   /bin/sh  /home/me/myproc.sh
이렇게 하면 끝입니다. 1분을 기다려서 제대로 프로세스가 뜨는지 확인하고, 
이후 강제로 죽인 다음 프로세스가 1분내에 재시작되는지 확인해 보면 됩니다.

만일 매일 새벽 02:00에 프로세스를 죽이고 싶다면 
pkill 커맨드를 이용하여 비슷한 방법으로 crontab에 등록하면 됩니다.

거의 모든 리눅스 및 유닉스 시스템에서 cron을 지원하기 때문에 이 방법을 이용하면 
간편하고 동일한 방법으로 프로세스를 무인 관리할 수 있습니다.

예제2

crontab -e

실행이후

1분마다 sh /root/daemon/daemon_up.sh 라는 명령어를 사용하여 프로세스를 실행시키고, 그 프로세스에서 출력한 output string을 /root/daemon/log/2016-01-14.log 에 저장

* * * * * sh /root/daemon/daemon_up.sh >> /root/daemon/log/2016-01-14.log

동일한 프로세스를 10분마다 실행

*/10 * * * * sh /root/daemon/daemon_up.sh >> /root/daemon/log/2016-01-14.log

동일한 프로세스를 매시 15분이 될때마다 실행

15 * * * * sh /root/daemon/daemon_up.sh >> /root/daemon/log/2016-01-14.log

동일한 프로세스를 1시간마다 실행

0 * * * * sh /root/daemon/daemon_up.sh >> /root/daemon/log/2016-01-14.log

동일한 프로세스를 2시간마다 실행

0 */2 * * * sh /root/daemon/daemon_up.sh >> /root/daemon/log/2016-01-14.log

동일한 프로세스를 매일 오후 2시 30분마다 실행

30 14 * * * sh /root/daemon/daemon_up.sh >> /root/daemon/log/2016-01-14.log

좀더 자세한 내용은 여기 http://blog.naver.com/PostView.nhn?blogId=won92h&logNo=140127216008

Tags: ,

Categories:

Updated: