콘텐츠로 건너뛰기
Home » cron : 리눅스에서 스케줄을 등록하는 방법

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

 cron 설정방법

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

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

cron 이란?

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

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

시작하는 법

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를 의미하며, 아랫 줄은 방금 실행한 검색 스크립트를 의미한다. 만약 데몬이 떠 있지 않다면 수동으로 중지했거나 시작이 안된것이다. cron을 시작하려한다면 crond라는 한 줄을 시작 스크립트에 추가하자. 이 프로세스는 자동으로 백그라운드로 구동하기 때문에 별도로 &를 붙이지 않아도 된다. 이제 다음번 재부팅때부터 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=/
# 기본적인 주기마다의 작업 실행
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 [args ... ]
  • minute : ‘0’에서 ’59’사이의 값으로 몇 분에 실행될 것인지를 정의한다.
  • hour : ‘0~23’ 사이의 값으로 몇 시에 실행될 것인지를 정의한다.
  • dom : day of month의 의미로 몇 일에 실행될 것인지를 정의한다.
  • month : 몇 월에 실행될 것인지를 정한다. 숫자외에 월의 이름을 써도 된다. (May, Jun 등)
  • dow : day of week로 무슨 요일에 실행될 것인지를 정한다. 요일이름을 쓸 수 잇다. (Sun) 0, 7은 모두 일요일을 의미한다.
  • user : 명령을 실행할 사용자를 지정한다.
  • cmd : 실행할 명령이다.

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

01  *  *  *  * root run-parts /etc/cron.hourly
# 매일 매시 1분에 root 권한으로 /etc/cron.hourly 내 모든 스크립트를 실행한다.
02  4  *  *  * root run-parts /etc/cron.daily
# 매일 새벽 4시 2분에 /etc/cron.daily 내 모든 작업을 실행한다.
# 2분으로 한 것은 매 1분에는 시간별 작업이 실행되기 때문이다.
22  4  *  *  0 root run-parts /etc/cron.weekly
# 매주 일요일(0) 4시 22분에 주간 작업들을 실행한다.
42  4  1  *  * root run-parts /etc/cron.monthly
# 매월 1일 4시 42분에 월간 작업들을 실행한다.

기본적으로 지정된 작업 외에 다음과 같이 명령을 추가해서 실행할 수 있다. 아래의 또 다른 예제들을 살펴보자

# 매시 1분에 실행
01 * * * * root echo "This command is run at one min past every hour"
# 매일 8시, 20시 17분에 실행
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"
# 매주 일요일 4시에 실행
00 4 * * 0 root echo "This command is run at 4 am every Sunday"
# 분이 생략되면 00분으로 간주
*  4 * * Sun root echo "So is this"
# 매월 1일 4시 42분에 실행
42 4 1 * * root echo "This command is run 4:42 am every 1st of the month"
# 7월19일이면 매시 1분마다 실행
01 * 19 07 * root echo "This command is run hourly on the 19th of July"

요일과 날짜는 같은 레벨에서 서로 다른 방식을 지정한다. 다음 예를 보자.

* 12 16 * Mon root cmd

위 명령은 16일 조건과 월요일 조건이 동시에 지정되었다. 이 두 개의 값은 OR로 판단한다. 따라서 매주 월요일 12시에 실행하면서 16일 12시에도 실행한다. 이 명령은 아래 명령을 하나로 압축한 것과 같다.

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

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

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

위 명령은 매주 월,화,수,목,금요일 11:59에 백업 스크립트를 실행하게끔한다. 이와 동일하게 1-5를 요일 필드에 쓸 수 있다.

59 11 * * 1-5 root backup.sh

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

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

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

리스트는 서로 결합하는 것도 가능한데, 다음 명령은 매월 1~15일과 20~25일 그리고 17일의 정오에 실행된다.

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

다음의 표현도 주목하자. 이는 10~16일 사이에 짝수날, 즉 10, 12, 14, 16일 정오마다 실행될 것이다.

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

아마존 Lightsail의 경우 시스템 서비스로 cron이 등록되어 실행되기 때문에 다음 명령으로 cron을 재시작할 수 있다. (사용자 계정의 패스워드 인증이 필요함)

$ service cron restart