리눅스마스터1급 : cron을 사용한 작업 자동화
작성자 정보
- 관리자 작성
- 작성일
컨텐츠 정보
- 2,676 조회
- 0 추천
- 목록
본문
리눅스마스터1급 : cron을 사용한 작업 자동화
시스템을 운영 중에 주기적으로 해야될 작업이 생기곤 한다.
예를 들어 /tmp 디렉토리를 그대로 놔둔다면 나중에는 쓸 때 파일로 가득차서 디스크가 꽉 차는 일이 생길 것이다.
그래서 주기적으로 이러한 파일들을 지워줘야 하는데 일일이 관리자가 지운다는 것은 상당히 번거로운 일이다.
이렇게 반복되는 특정한 명령이나 작업을 지정한 시간에 동작되도록 예약하고 싶을 때 Cron 기능을 이용하여 해결할 수 있다.
이 기능은 시스템 관리에 필요한 경우와 개별 사용자의 필요에 의한 경우로 나누어 사용할 수 있다.
① Cron 기능 관련 파일
다음은 Cron 기능과 관련한 것들이다.
∙crond 데몬과 /etc/init.d/crond 스크립트 : cron 기능을 사용하기 위한 데몬의 실행.
∙/etc/crontab : 시스템 관리를 위해 필요한 기본 설정 파일.
∙/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly 및
/etc/cron.monthly 디렉토리 내의 파일들 : 시스템 관리를 위해 필요한 시간별, 일별, 주별, 월별 실행 명령들에 관한 설정 파일들이 위치. 이에 대한 설정은 /etc/crontab에 기술되어 있음.
∙/etc/cron.d 디렉토리 내의 파일들 : 시간, 일, 주, 월 마다의 실행이 아닌 것들을 설정. /etc/crontab과 설정 방식이 동일.
∙/var/spool/cron 디렉토리 내 파일들 : 개별 사용자들의 cron 설정 파일들. crontab 명령으로 생성 및 편집.
∙/etc/cron.allow와 /etc/cron.deny : 사용자마다 cron에 제한을 둘 때 사용.
② 데몬의 실행
cron 기능을 사용하기 위해서는 우선 /etc/init.d/crond를 사용하여 데몬을 실행해야 한다.
이 스크립트 파일 뒤에 시작 시 start, 재시작 시 restart, 종료 시 stop을 기술하면 된다.
|
|
|
| # /etc/init.d/crond start |
|
|
|
|
또는
|
|
|
| # service crond start |
|
|
|
|
③ 시스템 관리를 위한 설정
시스템 관리를 위한 설정은 /etc/crontab 파일, /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly 디렉토리 내의 파일들, /etc/cron.d 디렉토리 내의 파일들을 통해 할 수 있다.
ⓐ /etc/crontab 파일
우선 기본 설정 파일로서 /etc/crontab에는 시스템의 cron 작업을 위해 분, 시간, 일, 주, 달 등으로 구분해서 각각 기술한 디렉토리 내의 위치한 쉘 스크립트가 실행되도록 설정되어 있다.
|
|
|
| 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 |
|
|
|
|
각 항목의 의미는 다음과 같다.
- SHELL=/bin/bash : cron이 실행할 때 기본적으로 쓸 쉘을 정의
- PATH=/sbin:/bin:/usr/sbin:/usr/bin : crontab에는 path를 지정할 수 있는데 cron에 등록되어 있는 모든 명령어와 스크립트들이 이 path를 기본으로 사용한다.
- MAILTO=root : cron 작업의 결과가 지정한 사용자에게 보내진다.
- HOME=/ : 스크립트나 명령이 실행될 홈 디렉토리를 설정한다.
- # run-parts 이하의 항목 : 주기에 따른 실행 설정을 한다.
“01 * * * *” 부분 : 분, 시, 날짜, 달 및 요일에 대한 설정인데, 이 5개 항목에 들어가는 숫자의 범위는 다음과 같다.
항목 | 허용될 수 있는 범위 |
분 (minute) | 0-59 내에서 설정 -로 범위 설정, 콤마(,)로 하나 이상 설정 가능. 이하 동일 |
시 (hour) | 0-23 내에서 설정 |
날짜 (day of month) | 1-31 내에서 설정 |
달 (month) | 1-12 (또는 달 이름 내에서 설정) |
요일 (weekday) | 0-7(0 또는 7 = 일요일. 요일명 사용 가능) |
그리고 다음의 “root run-parts /etc/cron.hourly” 부분은 root 사용자가 run-parts 명령으로 /etc/cron.hourly 디렉토리 아래의 파일들을 실행하는 것을 의미한다.
root와 명령 사이에는 “LANG=C”와 같은 명령 실행을 위한 환경변수가 하나 이상 들어갈 수 있다.
ⓑ /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly 내의 파일들
위 crontab 파일에 설정된 /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly 디렉토리에는 run-parts 명령에 의해 각각 분, 시, 날짜, 달, 요일 단위로 실행할 스크립트들이 포함된다.
이 디렉토리에 실행권한으로 스크립트를 넣어 놓으면 # run-parts 이하에 지정해 놓은 디렉토리 내에 해당되는 스크립트가 실행이 된다.
예를 들어 /etc/cron.hourly의 경우는, /etc/crontab에 다음과 같이 설정되어 있다.
|
|
|
| 01 * * * * root run-parts /etc/cron.hourly |
|
|
|
|
이것은 매시간 1분마다 /etc/cron.hourly 이하에 있는 모든 스크립트를 실행 할 것이다.
디렉토리 이름으로 알 수 있듯이 이들 디렉토리 내에 실행 스크립트 및 실행 가능한 파일을 넣어 둔다.
심볼릭 링크도 가능하다.
예를 들어 /etc/cron.daily 디렉토리 내부를 보자.
|
|
|
| [root@sulinux ~]# ls -l /etc/cron.daily/ 합계 68 -rwxr-xr-x 1 root root 379 3월 28 2007 0anacron lrwxrwxrwx 1 root root 39 6월 19 2010 0logwatch -> /usr/share/logwatch/scripts/logwatch.pl -rwxr-xr-x 1 root root 118 5월 25 2008 cups -rwxr-xr-x 1 root root 180 12월 2 2007 logrotate -rwxr-xr-x 1 root root 418 1월 6 2007 makewhatis.cron -rwxr-xr-x 1 root root 137 3월 15 2007 mlocate.cron -rwxr-xr-x 1 root root 2181 6월 21 2006 prelink -rwxr-xr-x 1 root root 114 5월 25 2008 rpm -rwxr-xr-x 1 root root 290 3월 15 2007 tmpwatch [root@sulinux ~]# |
|
|
|
|
이 디렉토리 내에 있는 모든 명령과 스크립트들은 앞서의 “02 4 * * * root run-parts /etc/cron.daily”라고 설정된 것에 따라 매일 4시 2분마다 실행된다.
그리고 다음은 디렉토리에 있는 스크립트 파일의 예제로서 앞서 설정된 시간에 실행된다.
파일에는 단순히 명령 라인이 기술되어 있어도 되고, 쉘프로그램이 기술될 수도 있다.
|
|
|
| # ! /bin/bash # update access statistics for the web site
if [ -s /var/log/httpd/access_log ] ; then /usr/bin/webalizer fi
exit 0 |
|
|
|
|
ⓒ /etc/cron.d 디렉토리 내의 파일들
/etc/cron.d 디렉토리 아래의 파일들은 /etc/crontab 파일과 동일한 설정 파일이다.
이 디렉토리 아래의 파일에는 시간, 날짜, 주, 달 주기에 맞지 않는 것들을 설정한다.
설정 방식은 /etc/crontab의 # run-parts 이하의 설정 방식과 동일하다.
④ 사용자별 cron 기능 설정
crontab 명령은 root를 포함하여 사용자별로 cron에 해당되는 작업을 등록 및 수정할 수 있도록 한다.
명령 방식은 다음과 같다.
|
|
|
| crontab [-u user] { -l -r -e } |
|
|
|
|
crontab과 함께 사용할 수 있는 옵션은 다음과 같다.
옵션 | 설명 |
-u | 이 옵션 다음에는 사용자 명이 온다.
이 옵션은 root 권한으로만 사용할 수 있다.
root는 다른 사용자에 관한 설정을 해야 될 필요가 있으므로 이 때 이 옵션을 사용한다.
이 옵션이 없는 경우에는 자신의 개별 crontab 파일을 편집한다.
|
-l | 현재 사용자가 개별 crontab 파일로 등록해 놓은 작업 리스트를 출력해 준다.
|
-r | 현재 사용자가 개별 crontab 파일로 등록해 놓은 작업을 삭제한다.
|
-e | 개별 crontab 파일로 등록하고 싶은 작업을 등록한다.
|
현재 사용자가 cron 작업을 등록하려면 -e 옵션을 사용하여 다음과 같이 명령을 실행한다.
그러면 vi 모드로 편집할 수 있는데, 편집 방법은 vi 명령과 동일하다.
|
|
|
| $ crontab -e |
|
|
|
|
그리고 root는 –u 옵션을 사용하여 다른 사용자의 cron 작업을 등록할 수 있다.
|
|
|
| $ crontab -u bible -e |
|
|
|
|
편집 작업의 예로서, 우선 time 서버에 rdate 명령을 이용해 매일 0시 0분에 시간을 가져와서 세팅을 하고자 하려면 다음과 같이 설정한다.
앞부분의 “0 0 * * *”은 /etc/crontab의 설정과 동일하다.
그리고 이후 부분은 실행하고자 하는 명령이다.
|
|
|
| 0 0 * * * /usr/bin/rdate time.bora.net |
|
|
|
|
이 예제에서 처음에 0 0 * * * 5개의 항목은 매일 0시 0분을 나타내는데 분, 시, 날짜, 달, 일주일의 요일을 의미한다.
그 다음에 오는 “/usr/bin/rdate time.bora.net”은 그 시각에 실행할 명령을 의미한다.
또한, * 문자의 의미는 * 해당 항목에 매번 지정된 시간에 명령이 실행이 됨을 의미한다.
즉, * 의 의미는 허용된 값의 처음부터 끝까지를 의미한다.
그리고 매년 1월 1일 0시 0분에 새해가 밝았음을 wall 명령어를 통해 모든 사용자에게 알리고 싶으면 다음과 같이 실행한다.
|
|
|
| 0 0 1 1 * /usr/bin/wall happy new year! |
|
|
|
|
다음 예제는 5분마다 echo 명령어를 실행하여 '5분이 지났습니다'라는 메시지를 콘솔에 뿌려준다.
|
|
|
| 0,5,10,15,20,25,30,35,40,45,50,55 * * * * echo '5분이 지났습니다' |
|
|
|
|
다음 예제는 2시간이 지날 때마다 echo 명령어를 실행한다.
|
|
|
| * */2 * * * echo '2시간이 지났습니다' |
|
|
|
|
설정을 마치고 나면 “:wq”로 편집을 마친다.
그러면 /var/spool/cron 디렉토리 내에 해당 사용자의 이름으로 파일이 생성된다.
|
|
|
| # ls /var/spool/cron bible root # |
|
|
|
|
다음은 설정을 마친 후에 –l 옵션을 사용하여 사용자별 crontab 파일에 설정된 내용을 확인하고, -r 옵션을 이용하여 이 내용을 삭제한 후에 다시 설정 내용을 확인한 것이다.
|
|
|
| # crontab -l * */2 * * * echo '2시간이 지났습니다' # crontab –r # crontab -l bo crontab for bible # |
|
|
|
|
root는 다른 사용자에 대해서 –u 옵션을 사용하여 위와 같은 작업을 할 수 있다.
|
|
|
| # crontab –u bible -l * */2 * * * echo '2시간이 지났습니다' # crontab –u bible –r # crontab –u bible -l bo crontab for bible # |
|
|
|
|
⑤ 사용자마다 cron에 제한두기
각 사용자마다 보안이나 다른 목적으로 cron 사용에 대한 제한을 걸 수도 있을 것이다.
또한 특정 사용자에게만 cron의 사용을 허가 해주거나 특정 사용자의 cron 사용을 제한하고 싶을 때도 있을 것이다.
이때, 특정 사용자에게만 cron 사용을 허가하려면 /etc/cron.allow 에 허가하고 싶은 사용자명을 입력한다.
이곳에 입력된 사용자 외의 모든 사용자는 cron 사용 불가가 된다.
이와 반대로 특정 사용자에게만 cron 사용을 제한하려면 /etc/cron.deny 에 제한하고 싶은 사용자명을 등록하면 된다.
마찬가지로 이곳에 입력된 사용자 외의 모든 사용자는 cron을 사용할 수 있다.
관련자료
-
이전
-
다음