강좌
클라우드/리눅스에 관한 강좌입니다.
자격증 분류

리눅스마스터1급 : cron을 사용한 작업 자동화

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

리눅스마스터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 328 2007 0anacron

lrwxrwxrwx 1 root root 39 619 2010 0logwatch -> /usr/share/logwatch/scripts/logwatch.pl

-rwxr-xr-x 1 root root 118 525 2008 cups

-rwxr-xr-x 1 root root 180 122 2007 logrotate

-rwxr-xr-x 1 root root 418 16 2007 makewhatis.cron

-rwxr-xr-x 1 root root 137 315 2007 mlocate.cron

-rwxr-xr-x 1 root root 2181 621 2006 prelink

-rwxr-xr-x 1 root root 114 525 2008 rpm

-rwxr-xr-x 1 root root 290 315 2007 tmpwatch

[root@sulinux ~]#

 

 

 

 

 

 

이 디렉토리 내에 있는 모든 명령과 스크립트들은 앞서의 “02 4 * * * root run-parts /etc/cron.daily”라고 설정된 것에 따라 매일 42분마다 실행된다.

 

 

 

 

그리고 다음은 디렉토리에 있는 스크립트 파일의 예제로서 앞서 설정된 시간에 실행된다.

 

 

 

파일에는 단순히 명령 라인이 기술되어 있어도 되고, 쉘프로그램이 기술될 수도 있다.

 

 

 

 

 

 

 

 

 

# ! /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

 

 

 

 

 

그리고 rootu 옵션을 사용하여 다른 사용자의 cron 작업을 등록할 수 있다.

 

 

 

 

 

 

 

 

 

$ crontab -u bible -e

 

 

 

 

 

편집 작업의 예로서, 우선 time 서버에 rdate 명령을 이용해 매일 00분에 시간을 가져와서 세팅을 하고자 하려면 다음과 같이 설정한다.

 

 

 

앞부분의 “0 0 * * *”/etc/crontab의 설정과 동일하다.

 

 

 

그리고 이후 부분은 실행하고자 하는 명령이다.

 

 

 

 

 

 

 

 

 

0 0 * * * /usr/bin/rdate time.bora.net

 

 

 

 

 

 

 

이 예제에서 처음에 0 0 * * * 5개의 항목은 매일 00분을 나타내는데 분, , 날짜, , 일주일의 요일을 의미한다.

 

 

 

그 다음에 오는 “/usr/bin/rdate time.bora.net”은 그 시각에 실행할 명령을 의미한다.

 

 

 

또한, * 문자의 의미는 * 해당 항목에 매번 지정된 시간에 명령이 실행이 됨을 의미한다.

 

 

 

, * 의 의미는 허용된 값의 처음부터 끝까지를 의미한다.

 

 

 

 

그리고 매년 1100분에 새해가 밝았음을 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을 사용할 수 있다.

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,043 명
  • 현재 강좌수 :  35,853 개
  • 현재 접속자 :  82 명