리눅스 (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 와 동일하다.

댓글

이 블로그의 인기 게시물

Install and run an FTP server using Docker

Using the MinIO API via curl

PYTHONPATH, Python 모듈 환경설정

Elasticsearch Ingest API

오늘의 문장2

How to checkout branch of remote git, 깃 리모트 브랜치 체크아웃

Fundamentals of English Grammar #1

To switch to a specific tag in a Git repository

You can use Sublime Text from the command line by utilizing the subl command

티베트-버마어파 와 한어파(중국어파)의 어순 비교