소프트웨어 유틸리티 cron은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러이다. 소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.
cron은 리눅스에만 있는 개념이 아니라, 주기적인 잡 스케쥴 실행을 위한 S/W 유틸리티이다.
cron은 셸 명령어들이 주어진 일정에 주기적으로 실행하도록 규정해놓은 crontab (cron table) 파일에 의해 구동된다. crontab 파일들은 잡 목록 및 cron 데몬에 대한 다른 명령들이 보관된 위치에 저장되어 있다. 사용자들은 자신들만의 개개의 crontab 파일들을 가질 수 있으며, 가끔은 /etc 또는 /etc의 하위 디렉터리에 시스템 관리자들만이 편집할 수 있는, 시스템 전반에 영향을 미치는 crontab 파일이 존재하는 경우도 있다.
"사용자들"이라 함은 리눅스 운영체제 계열의 유저, 사용자 계정을 의미한다. 사용자에 대한 내용은 관리부터 활용까지 해당 시리즈에서 정리할 예정이다.
batch 성격을 가지고 있는 작업의 경우.
주로 특정 로그 관리, 보안 취약점 테스트, 특정 시간에 특정 액션을 취해야 할 때 많이 사용 된다.
$ ps -ef | grep cron
root 1227 1 0 Feb10 ? 00:00:37 /usr/sbin/cron -f
위와 같이 찾아보면, cron이 -f 옵션으로 데몬 형태로 돌아가는 것을 볼 수 있다. -> 부팅시 백그라운드로 실행된다. 이 데몬 형태 cron을 crond라고 한다.
시스템 크론데몬인 crond를 실행, 중지, 재시작하려면 /etc/rc.d/init.d/crond스크립트를 이용한다. (/etc/rc.d 하위에서 심볼링 링크로 이어져 있다. -> 리눅스의 "데몬"에 대해서 알아야 한다.) -> init.d는 리눅스의 시작 데몬 위치이다.
(sudo) find / -name crontab
한 번 해보자.위 와 같다. (4)번 항목의 경로에 대해서는 리눅스 계열 마다 다를 수 있다.
일반적으로 BSD계열의 리눅스는 /var/spool/cron/ID, 솔라리스 계열은 /var/spool/cron/crontabs/ID에 위치하고 있다. 조금 더 자세한 사항은 crontab을 보면서 다시 한 번 살펴보자!
이 글은 데비안 계열, ubuntu에 초점이 좀 맞춰져 있다. 필자가 제일 편한게 우분투라서..
cron 유틸리티가 작업을 설정하는 파일을 crontab파일 이라고 한다. cron을 사용하려면 crontab에 스케쥴 파일을 등록해야 한다는 것이다. 해당 스케쥴을 우리는 crontab 명령어를 통해 만들 수 있다.
sudo vi /etc/crontab
으로 까보자.
crontab -help 으로 가능한 명령어 리스트를 살펴보자!
$ crontab -help
crontab: invalid option -- 'h'
crontab: usage error: unrecognized option
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)
crontab -e
: 크론탭 설정. 어떤 에디터 (입력 형태)로 crontab을 작성할지 선택하면 된다. 여기서 크론탭 명령어를 입력 후 :wq 를 통해 크론탭을 갱신시킬 수 있다. -> nano같은 경우에는 물론 ^X 와 같이 상이할 수 있다.$ crontab -e
no crontab for ubuntu - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:
crontab -l
: 명령어를 실행하는 해당 유저의 crontab 리스트를 보여준다.
crontab -r
: 명령어를 실행하는 해당 유저의 crontab 을 삭제한다.
크론탭 하나 등록해보자!
a. 만약 crontab -e 에서 nano로 해서 불편하다면? 정확한 이해가 없는 상태에서 nano를 쓰면 crontab 파일을 제 위치에 저장을 못 할 수 도 있다.
b. 해당 유저의 /etc/profile 맨 아래줄에 exprot VISUAL=vim
을 추가하고 재 로그인을 해보자!
c. (b)가 싫으면 nano자체 심볼릭 링크를 vim으로 바꾸는 방법이 있다.
$cd /bin
$mv nano nano_must_die # 디렉토리명은 그냥 마음대로, 즉 nano를 옮겨버리는 것 ㅋ
$ln -s /usr/bin/vim nano
* * * * * ls -al
입력 해 보자. -> 1분만 기다려 보면 아무것도 안했는데 ls -al 명령어가 실행되는 것을 볼 수 있다. -> 만약 안되는 것 같다? cat /var/log/syslog | grep CRON
를 통해 syslog에서 cron 관련 Log를 살펴보자!crontab -u
: 루트 사용자가 다른 사용자의 crontab을 관리할 때 사용한다. # 매분 test.sh 실행
* * * * * /home/script/test.sh
# 매주 금요일 오전 5시 45분에 test.sh 를 실행
45 5 * * 5 /home/script/test.sh >> /home/test_sh_cron.log
# >> 명령어를 활용해 실행 Output을 log파일 형태로 append하게 만들 수 있다.
# 매일 매시간 0분, 20분, 40분에 test.sh 를 실행
0,20,40 * * * * /home/script/test.sh
# 매일 1시 0분부터 30분까지 매분 tesh.sh 를 실행
0-30 1 * * * /home/script/test.sh
# 매 10분마다 test.sh 를 실행
*/10 * * * * /home/script/test.sh
# 5일에서 6일까지 2시,3시,4시에 매 10분마다 test.sh 를 실행
*/10 2,3,4 5-6 * * /home/script/test.sh
# 1월부터 12월까지 2개월마다 1일날 오전 4시 10분에 test.sh 를 실행
10 4 1 1-12/2 * /home/script/test.sh
*
: 각 필드 자리에 별기호가 오면 해당 필드의 모든 값을 의미한다.-
: 그 사이의 모든 값 (정규식),
: 지정한 모든 값을 의미한다. 불규칙적인 값 지정시 주로 사용한다./
: 연결된 설정 값 범위에서 특정 주기로 나눌 때 사용crontab -l > /home/bak/crontab_bak.txt
# 이걸 그냥 자동화 해버리는 것!
# 매일 오후 11시 50분에 크론탭을 백업
50 23 * * * crontab -l > /home/bak/crontab_bak.txt
서버가 일정 시간 중지되었을 때에도 작업이 실행되는 것을 보장하기 위해 사용하는 도구이다.
anacron은 정해진 시간을 주기로 작업을 수행하는 것이 아니라, 해당 작업이 정해진 시간 내에 실행된 적이 있는지를 점검한 후 만약 정해진 시간 내에 수행한적이 없다면, 해당 작업을 여유를 두고 실행한다.
시스템크론 설정 디렉토리 -> cron은 주기적으로 실행할 내용을 시스템 크론 설정 디렉토리에 넣어 놓고 작동한다.
이름 따라 매일, 매주, 매달, 매시 마다 수행 될 내용들을 담고 있다.
크론탭을 사용하면서 가장 많이 일어나는 실수는 아래 4가지 정도인 것 같다. (스스로 에게 물어봤을때 ㅎ.. 무려 4가지나 된다)