리눅스 (cron - 주기적 작업실행 데몬)

cron 데몬의 가동은 /etc/rc.d/init.d/crond 에 있다. 보통 시스템의 어떤 런레벨이든지 cron 데몬은 부팅 시 시작하도록 되어 있는데, 굳이 cron 데몬을 죽이거나 다시 시작하기 위해서는 위의 /etc/rc.d/init.d/crond 실행 스크립트를 실행하면 된다. cron 데몬에 작업을 설정하기 위해서는 cron table 을 설정하는 crontab 이라는 실행파일을 사용한다.

cron table 을 편집하기 위해서는 crontab -e 명령을 사용한다.
입력 형식은 아래와 같다.


#crontab -e
01 4 * * *  /etc/rc.d/init.d/network stop
15 4 * * * ~/scripts/my_script.sh
00 5 * * * /etc/rc.d/init.d/network start

위의 내용이 cron table 에 입력된 내용인데 이러한 입력형식은 아래와 같다.

M H D m d cmd-line
필드명범위설명
M0-59,*분을 의미하며, *는 모든 볌위를 말함
H0-23,*시를 의미함
D1-31,*날짜를 의미함
m1-12,*달을 의미함
d0-7,*요일을 의미하며,0과 7은 일요일(Sun)을 의미함
cmd-line실행할 명령을 입력

각자의 사용자가 등록한 cron table 은 /var/spool/cron 디렉토리에 저장된다.

입력 내용의 다른 예를 보면,
30  13  *  * 1-5  mail -s "It's 2pm" root% Dear root% % Are you sleeping??

같은 경우는 월요일부터 금요일까지 오후 1시 30분에 해당 mail 명령을 실행하게 된다.
위에서 %문자는 개행문자 역할을 하며(풀어 쓰면 아래와 같은 명령이 된다.), 한줄이 넘어가는 명령을 쓰기 위해서는 백슬래쉬를 써주고 다시 개행해서 쓰면 된다.


$mail -s "It's 2pm" root
Dear root

Are you sleeping?
[EOT]



* /etc/crontab

cron table 을 작성하는 crontab 실행파일은 /usr/bin/crontab 에 위치하고 있다. 그런데 /etc 디렉토리에도 crontab 파일이 있는데 이는 crontab 설정파일이다. 그 내용은 아래와 같다.



[root@systech-dev /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


SHELL : 실행명령을 실행할 쉘의 종류
PATH : 실행파일을 검색할 PATH
MAILTO : 실행결과를 보고하는데 사용할 email 주소

그리고 실행파일이 들어가야 할 부분에 "root run-parts  /etc/cron.xxxxx" 라고 되어 있다.
root는 뒤의 "run-parts ..."라고 나오는 명령행을 실행할 유저명이고 위의 내용들은 각각 처음부텉 만들어져 있는 스크립트로서 run-parts 라는 스크립트를 이용해서 해당 디렉토리 내에 있는 모든 실행파일을 실행하도록 되어 있다. 그래서 만일 어떤 명령이 매시마다. 혹은 매일, 매주, 매달마다 실행되어야 하는 명령이라면 해당 디렉토리(/etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly, /etc/cron.weekly)에 실행파일(혹은 스크립트)을 넣어주거나 링크파일을 넣어두면 된다.

참고로 /usr/bin/run-parts 스크립트의 내용은 아래와 같다.



[root@systech-dev /root]# cat < /usr/bin/run-parts
#!/bin/bash

# run-parts - concept taken from Debian

# keep going when something fails
set +e

if [ $# -lt 1 ]; then
        echo "Usage: run-parts <dir>"
        exit 1
fi

if [ ! -d $1 ]; then
        echo "Not a directory: $1"
        exit 1
fi

# Ignore *~ and *, scripts
for i in $1/*[^~,] ; do
        [ -d $i ] && continue
        # Don't run *.{rpmsave,rpmorig,rpmnew,swp} scripts
        [ "${i%.rpmsave}" != "${i}" ] && continue
        [ "${i%.rpmorig}" != "${i}" ] && continue
        [ "${i%.rpmnew}" != "${i}" ] && continue
        [ "${i%.swp}" != "${i}" ] && continue
        [ "${i%,v}" != "${i}" ] && continue

        if [ -x $i ]; then
                $i 2>&1 | awk -v "progname=$i" \
                              'progname {
                                   print progname ":\n"
                                   progname="";
                               }
                               { print; }'
        fi
done

exit 0


첫번째 if 문은 run-parts 명령을 인수가 없이 그냥 run-parts 만 실행하면 명령어 뒤에 디렉토리를 명시하라는 사용법 메시지를 보여준다는 내용.

두번째 if 문은 run-parts 의 첫번째 인수가 디렉토리가 아니면 "Not a directory : 입력한 인수" 를 출력하고 빠져나감.

세번째줄 for 문은 인수로 받은 디렉토리 내의 파일들($1/*)을 하나씩 대입해서 실행파일이면([ -x $1 ]) 실행한다는 내용이다.



3. cron 데몬의 사용 유저 제한

cron 데몬도 at 데몬과 마찬가지로 유저에 따라 사용을 제한할 수가 있는데 역시 /etc/cron.allow 와 /etc/cron.deny 파일을 사용하며, 사용법음 at.allow, at.deny 와 동일하다.

댓글 없음:

댓글 쓰기

깔끔 테마. Powered by Blogger.