cron : 리눅스에서 스케줄을 등록하는 방법

 cron 설정방법

cron 설정 방법을 알아보던 중에 아래의 훌륭한 글을 발견하고 간단하게 번역해보았다.

http://www.unixgeeks.org/security/newbie/unix/cron-1.html

cron 이란?

cron은 유닉스 사용자로 하여금 특정한 명령이나 스크립트를 지정한 시간/날짜에 자동으로 실행하게 해주는 프로그램의 이름이다. 이는 주기적으로 시스템 백업 스크립트를 실행하는 등 시스템 관리자에 의해 많이 사용되며, 그 외에도 특정한 작업을 스케줄링하기 위해 사용될 수 있다. 최근에는 자동으로 인터넷에 접속해서 이메일을 다운로드 받는 등의 용도로 쓰이기도 한다.1

시작하는 법

cron은 일종의 데몬이다. 즉 한 번말 실행되면 시스템에 상주하며 필요할 때 동작한다. 비슷한 예로 웹서버도 일종의 데몬으로 웹페이지에 대한 요청이 들어올 때만 작동한다. 데몬 크론은 crond라는 이름을 같는데, 설정 파일 혹은 crontab에 기록된 날짜나 시간이 될 때까지 기다린 다음 동작을 시작한다.

대부분의 유닉스 배포판에서 crond는 이미 포함되어 있고, 시작 스크립트에 기록되어 있다. 만약 크론이 실행되고 있는지 살펴보려면 다음과 같이 확인할 수 있다.

cog@pingu $ ps aux | grep crond
root       311  0.0     0.7     1284    112 ?      S   Dec24   0:00 crond
cog        8606 4.0     2.6     1148    388 tty2   S   12:47   0:00 grep crond

첫줄은 실행되고 있는 crond를 의미하며, 아랫 줄은 방금 실행한 검색 스크립트를 의미한다. 만약 데몬이 떠 있지 않다면 수동으로 kill 했거나 시작이 안된것이다. cron을 시작하려한다면 crond라는 한 줄을 시작 스크립트에 추가하자. 이 프로세스는 자동으로 백그라운드로 구동하기 때문에 별도로 &를 붙이지 않아도 된다. 이제 다음번 재부팅때부터 cron이 실행될 것이다. 만약 재부팅 없이 실행하려면 루트 권한으로 이를 시작해야 한다.

많은 데몬류 프로그램들은 설정 파일을 수정하고 나면, 수정된 내용을 반영하기 위해서 데몬을 재시작해야 할 필요가 있다. Vixie Cron의 경우, crontab 명령으로 설정을 변경하면 자동으로 설정 파일을 재로드하게 된다. 또 어떤 크론 버전들은 매 분마다 설정 파일을 새로 읽거나, 매 분마다 재시작하기도 한다.

크론 사용하기

(놀랍게도) 크론을 사용하는 몇 가지 방법이 있다.

/etc 디렉토리 내에서 다음과 같은 디렉토리들을 찾을 수 있을 것이다. cron.hourly, cron.daily, cron.weekly, cron.monthly. 이 디렉토리 내에 스크립트 파일을 저장해해두면 디렉토리에 따라서 매 시간, 매일, 매주, 매월등 특정 주기마다 해당 스크립트가 실행된다.

설정값 편집하기

이 보다 좀 더 유연한 동작을 원한다면 crontab(cron의 설정파일 이름이다.)을 편집한다. 주 설정 파일의 위치는 보통 /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

첫번째 영역은 보는 그대로 cron의 환경변수 세팅이다. SHELL은 cron이 사용하는 쉘의 위치이다. PATH역시 쉘이 명령을 실행할 때 뒤져보는 경로들이다. 만약 /usr/cog/bin 아래에 있는 foo 스크립트를 실행해야 한다면 :/usr/cog/bin을 뒤에 추가해주면 좋을 것이다. HOME은 cron이 사용하는 홈 디렉토리가 된다.

두 번째 파트는 다소 복잡해 보인다. 각 라인은 다음과 같이 쪼개진다.

minute  hour  dom  month  dow  usr  cmd
  • minute : ‘0’에서 ’59’사이의 값으로 몇 분에 실행될 것인지를 정의한다.
  • hour : ‘0~23’ 사이의 값으로 몇 시에 실행될 것인지를 정의한다.
  • dom : day of month의 의미로 몇 일에 실행될 것인지를 정의한다.
  • month : 몇 월에 실행될 것인지를 정한다. 숫자외에 월의 이름을 써도 된다. (May, Jun 등) 0, 7은 모두 일요일을 의미한다.
  • dow : day of week로 무슨 요일에 실행될 것인지를 정한다. 요일이름을 쓸 수 잇다. (Sun)
  • user : 명령을 실행할 사용자를 지정한다.
  • cmd : 실행할 명령이다.

값을 지정하지 않으려면 *을 사용한다. 즉 위의 스크립트의 각 행은 다음과 같은 의미를 갖는다.

01  *  *  *  * root run-parts /etc/cron.hourly # 매시 1분에 시간별 액션을 실행한다.
02  4  *  *  * root run-parts /etc/cron.daily  # 매일 4시 2분에 일별 액션을 실행한다.
22  4  *  *  0 root run-parts /etc/cron.weekly # 매 일요일 4시 22분에 주간 액션을 실행한다. 
42  4  1  *  * root run-parts /etc/cron.monthly # 매월 1일 4시 42분에 월간 액션을 실행한다. 

또다른 예제들을 살펴보자

01 * * * * root echo "This command is run at one min past every hour"
17 8 * * * root echo "This command is run daily at 8:17 am"
17 20 * * * root echo "This command is run daily at 8:17 pm"
00 4 * * 0 root echo "This command is run at 4 am every Sunday"
*  4 * * Sun root echo "So is this"
42 4 1 * * root echo "This command is run 4:42 am every 1st of the month"
01 * 19 07 * root echo "This command is run hourly on the 19th of July"  

요일, 날짜등이 동시에 설정된 경우에는 두 조건 중 한 조건을 만족하면 된다.

* 12 16 * Mon root cmd

위 명령은 매달 16일이나, 매주 월이욜 정오가되면 주어진 명령을 실행하는 명령이 되며, 사실 상 아래 두 개의 엔트리를 하나로 압축한 것이다.

* 12 16 * * root cmd
* 12 * * Mon root cmd

Vixie Cron은 필드에 리스트를 받을 수 있다. 리스트는 공백없이 컴마로 연결된 숫자 혹은 하이픈으로 연결된 범위를 말한다.

59 11 * * 1,2,3,4,5 root backup.sh

위 명령은 매주 월,화,수,목,금요일 11:59에 백업 스크립트를 실행하게끔한다. 이와 동치의 엔트리로

59 11 * * 1-5 root backup.sh

이렇게 할 수 있다.

또, step을 설정할 수 있는데, */2dom필드에 설정하면 짝수날을 의미하며 */5hour 필드에 설정하면 매 5시간마다의 의미가 된다.

*/15 9-17 * * * root connection.test

9시~17시 사이에 매 15분마다 실행된다.

리스트는 서로 결합하는 것도 가능한데,

* 12 1-15,17,20-25 * * root cmd

는 매월 1~15일과 20~25일 그리고 17일의 정오에 실행된다.

다음의 표현도 주목하자

* 12 10-16/2 * * root backup.sh

이는 10, 12, 14, 16일 정오마다 실행한다는 의미이다.


  1. 무슨 주기적으로 이메일을 다운로드 받냐고 하는 의문이 들 수 있는데, 이 글의 원문이 쓰여진 시점이 1999년이다.