반복되는 시스템 작업을 자동화 시켜주는 'cron' Linux2007/06/03 14:22
아주 오래 전(2003년 초 쯤?)에 작성 했던 글...
1.cron이 뭐지?
cron 은 자동으로 사용자가 지정해 놓은 명령어를 알아서 정해진 시간에 반복적으로 실
행시켜주는 역할을 합니다. 즉 관리자 입장에서는 '5분간격으로 시스템 로그파일을 검색해서
이상한 흔적있으면 나한테 메일 보내라', '평일에는 시스템을 사용하는 사람이 많으니까 일요일
에 풀백업을 받아라'... 이런 식으로 cron에게 작업을 등록시켜두면 지가 알아서 주어진
일을 처리하고 관리자에게 결과를 통보해 준답니다.
참 편리하죠? 만약 관리자인 여러분이 5분마다 시스템 로그 파일을 직접 확인해야 한다고
생각해보세요... 어휴, 상상도 하기 싫어집니다.
2.cron설정및 사용법
cron은 관리자가 등록시켜놓은 작업을 정해진 시간에 반복적으로 한다고 하였습니다.
그렇다면 관리자가 cron에 어떻게 작업을 등록 시키는지 그 방법을 알아보도록 하겠습니다.
제일 먼저 cron을 사용할려면 crond라는 데몬이 구동 중이어야 합니다. 지금 한번 확인해
보세요.
root 536 1 0 07:42 ? 00:00:00 crond <-----
root 692 642 0 07:43 pts/0 00:00:00 grep cron
위 화살표 부분처럼 결과가 나타난다면 cron 데몬이 구동중입니다. 만약 위처럼 나타나지 않는
다면 '/etc/init.d/crond start' 로 실행시키면 됩니다.
[root@new21 root]# /etc/init.d/crond start
crond (을)를 시작합니다: [ 확인 ]
이제 cron 에 작업을 등록시키면 되는데 이때 사용하는 명령어가 crontab 입니다.
일반적으로 사용하는 crontab명령어의 형식입니다.
여기서 -u 다음에는 사용자의 계정이름이 나오고 그 사용자의 cron작업을 하는겁니다.
-l 옵션은 자신에게 등록되어져 있는 작업목록을 보여줍니다.
-r 은 등록되어 있는 작업을 삭제합니다. 이건 조심해서 써야겠죠?
-e 는 작업을 새로 등록하거나 수정할때 사용합니다.
예제 화면을 보시면 위 옵션들을 어떻게 사용하는 건지 이해가 쉬우리라 생각됩니다.
cron에 어떤 작업이 등록되어 있는지 확인해 봅시다.
[root@new21 root]# crontab -l
no crontab for root
예, 아무것도 없다고 나오죠... 그럼 새로운 작업을 한 번 등록시켜 봅시다.
[root@new21 root]# crontab -e
(-u 사용자이름 옵션이 생략될 시에는 디폴트로 본인의 crontab을 작성하게 되고
root사용자는 'crontab -e -u shsch' 이런식으로 사용하면 shsch사용자의 crontab
을 작성할 수 있습니다.)
가끔 질답난에 crontab -e했는데 문자를 입력할 수 없는 이상한 것이 뜬다고 하는 분들
이 있습니다. 왜 vi 가 안되냐고 하면서...
이건 EDITOR 라는 환경변수가 제대로 설정이 되어 있지 않아서 그런겁니다.
export EDITOR=vi 해주시면 vi가 crontab을 편집할때 사용되는 기본 편집기로 사용될
겁니다.
TIP-2.
crontab -e 명령으로 crontab을 작성하고 나면 /var/spool/cron/ 디렉토리 밑에 사용
자의 이름으로 파일이 생성됩니다. 예를 들어 root사용자가 자신의 crontab을 작성
했다면 /var/spool/cron/root라는 이름의 파일이 만들어 지는 것입니다.
그렇기 때문에 crontab명령어를 이용하지 않고도 편집기를 이용해 같은 디렉토리 밑에
사용자 이름으로 파일을 만들어 crontab에 등록 시킬 내용을 써넣을 수도 있습니다.
이렇게 하면 vi 에디터로 작업을 등록 할 수 있는 화면이 뜨게 됩니다.
일단 간단한 작업을 하나 입력시켜 보고 형식에 대해 설명드리죠...
0 1 * * * rdate -s time.kriss.re.kr
( 매일 오전 1시에 한국표준연구서 타임서버에서 시간을 가져와 동기화 시킨다.)
crontab의 형식은 '분 시 일 월 요일 명령어' 이렇게 6개의 필드로 나누어져 있으며 각각
의 필드는 띄어쓰기로 구분이 되고 다음과 같이 표현할 수 있습니다.
분(Min) 0 - 9
시(Hour) 0 - 23
일(Day) 0 - 31
월(Month) 0 - 12 (또는 영문으로 1은 Jan 2는 Feb...이렇게도 사용가능.)
요일(Week) 0 - 7 (0 또는 7은 일요일, 1-월요일, 2-화요일, 3-수요일, 4-목요일, 5-금요일,
6-토요일, sun과 같은 영문이름으로도 사용가능)
위에서 보이는 '*'는 뭘까요? *가 분에 있으면 '매분마다'가 되고 시간 자리에 있으면 '매
시간마다', 일자리에 있으면 '매일마다', 월자리면 '매월마다', 요일자리에 있으면 일자리에 있는 거랑 똑같이 매일이 되겠죠...
위의 예제를 보면 분에 '0'이 시간에 '1'이니까 오전 1시에 수행을 하는데 그다음 항목이
일(Day)인데 '*' 로 되어있으니까 매일 한다는 거고 그다음 월이 또 '*' 이거니까 매년 한다는
거죠. 그리고 마지막 항목인 요일도 '*'니까 위에서 처럼 365일 매일 오전 1시에 실행하게
되는 것입니다. 만약 5번째 요일 필드가 '0'으로 되어 있다면 일요일 오전 1시에만 실행한다는
것이 되겠죠.
이해가 가시나요?
몇 가지 예를 더 들어볼테니 스스로 한번 생각해 보세요...^^
0 0 1 1 * /usr/bin/wall happy new year!
매년 1월 1일 0시에 wall이라는 명령어를 통해 사용자들에게 'happy new yeary!' 라는
새해 인사메세지를 보냅니다.
아래는 4, 6, 10, 12월에 각 계절에 맞는 노랫말을 보여주는 예제입니다.
00 00 20 04 * echo '봄이 오면 강산에 꽃이 피고...'
00 00 20 06 * echo '여름이면 꽃들이 만발하네...'
00 00 20 10 * echo '가을이면 강산에 단풍들고...'
00 00 20 12 * echo '겨울이면 아이들의 눈장난...'
매 5분간격으로 어떤 명령어를 실행시킬려면 어떻게 할까요?
첫번째 분을 적는 필드에 0,5,10,15,20... 이렇게 적을까요?
이렇게 하면 길고 귀찮죠? 이럴때는 '*/5' 이렇게 표시한답니다.
그럼 매 2 시간 마다는 어떻게 할까요? 두번째 시간 필드에 '*/2' 이렇게 하면 되겠죠.
직접 간단한 것들을 실습해 보시면 쉽게 이해가 가실겁니다. 그리고 최소한 crontab의 6개의
필드 항목만 알고 있으면 표현 형식은 그때 그때 'man 5 crontab' 실행시켜 man 페이지를
참조하면서 사용하실 수 있습니다.
man 페이지를 자주 보는 습관을 길르시는 것이 많은 도움이 되실겁니다. crontab man
페이지는 한글로 번역되어져 있으니까 괜히 '나, 영어 잘모르는데...' 하고 겁부터 먹지는
마세요...^^
3.cron은 누가 사용할 수 있나?
cron은 리눅스 시스템 설치시 디폴트로 모든 계정 사용자들이 사용할 수 있습니다.
즉 자신의 작업을 cron에 등록시켜 놓고 사용할 수 있는 거죠. 그렇지만 root사용자에
의해 사용을 통제할 수 있습니다.
/etc/cron.allow파일이 있고 그안에 사용자 이름이 등록되어 있으면 그들만이 cron을 사용
할 수 있습니다. 만약 /etc/cron.allow파일이 없고 /etc/cron.deny파일이 있으면 이 파일은
사용 하지 못할 사용자 이름 목록을 가집니다.
즉 여기에 등록되어 있는 사용자들은 cron을 사용할 수 없고 그 외는 사용 가능하단
얘깁니다.
4.cron실행 결과 확인하기
귀찮은 반복적인 작업은 cron이 알아서 하겠지만서도 이놈이 제대로 실행이 되었는지 확
인은 여러분이 직접하셔야 겠죠? 그럼 cron의 실행여부를 어디서 확인할 수 있을까요?
바로 /var/log/ 디렉토리 밑에 보면 cron이라는 이름의 파일이 있습니다.
이 파일에 cron을 실행한 사용자명, 날짜, 시간등의 내용이 기록되어있습니다.
[root@new21 root]# tail /var/log/cron
Apr 2 04:04:12 new21 crond[528]: (CRON) STARTUP (fork ok)
Apr 9 07:42:47 new21 crond[536]: (CRON) STARTUP (fork ok)
Apr 9 08:01:00 new21 CROND[729]: (root) CMD (run-parts /etc/cron.hourly)
Apr 9 08:16:39 new21 4월 9 08:16:39 crontab[790]: (shsch) BEGIN EDIT (shsch)
Apr 9 08:16:42 new21 4월 9 08:16:42 crontab[790]: (shsch) END EDIT (shsch)
Apr 9 08:30:23 new21 4월 9 08:30:23 crontab[939]: (root) LIST (root)
Apr 9 08:31:03 new21 4월 9 08:31:03 crontab[940]: (root) LIST (root)
Apr 9 08:32:25 new21 4월 9 08:32:25 crontab[942]: (root) BEGIN EDIT (root)
Apr 9 08:32:30 new21 4월 9 08:32:30 crontab[942]: (root) END EDIT (root)
Apr 9 09:01:00 new21 CROND[1022]: (root) CMD (run-parts /etc/cron.hourly)
5.시스템에 있는 cron 활용
레드햇 계열의 리눅스 배포판을 사용하고 계신다면 /etc 디렉토리에서 아래와 같이 해보
세요.
[root@new21 etc]# ls cron*
crontab
cron.d:
cron.daily:
logrotate makewhatis.cron rpm slocate.cron tmpwatch
cron.hourly:
cron.monthly:
cron.weekly:
makewhatis.cron
디폴트로 배포판에서 사용하기 쉽게 구성해 놓은 crontab 파일들입니다.
/etc/crontab 이라는 파일은 시스템 전체에 대한 cron설정 파일입니다.
내용을 한 번 볼까요?
[root@new21 root]# cat /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이 작업할 작업 환경 변수들이 설정되어있고 MAILTO=root를 통해
cron 실행결과를 root사용자에게 메일로 보내도록 되어 있습니다.
위의 #run-parts 부분을 한줄씩 해석해 보면 맨윗줄은 매시 1분마다 /etc/cron.houry
디렉토리 밑에 있는 쉘스크립트 (명령어의 모음)를 실행시키라는 얘기고 그 다음줄은 매일
새벽 4시 2분에 /etc/cron.daily 밑의 파일들을 실행하고 그다음은 매 일요일 새벽 4시 22분
에 /etc/cron.weekly 밑의 파일들을 실행하고 맨 마지막 줄은 매월 1일 새벽 4시 42분에
/etc/cron.monthly밑에 파일들을 실행시킨다는 뜻입니다.
음, 이렇게 해석하고 보니까 매 시간마다 하는 작업, 매일 하는 작업, 일주일에 한번 하는
작업, 한달에 한번하는 작업명령어들을 각각의 디렉토리에 넣어두면 규칙적으로 실행이
되겠네요...
6.글을 마치며
처음이라 미흡한 점이 많이 느껴지지만 앞으로 더욱 노력하겠습니다. 이 문서의 저작권
은 없으니까 퍼가지고 가실분들은 마음대로 하셔도 상관없습니다. 그리고 잘못된 부분들이
있으면 주저없이 말씀해 주시면 바로 수정하도록 하겠습니다.
기타 의문사항이 있으시면 '질문과답변'게시판에 남겨주시구요.
그럼 끝까지 읽느라 수고하셨습니다.
