11/18/2018

cron 과 anacron

1. cron  란?

반복적인 작업을 해야할 경우가 필요해져서  cron 이라는  damon 을 알게되었고 간단히 사용법을 정리한다.

1.1 cron 의 기본사용법

우선 아래와 같이 cron이 존재하는지와 디렉토리가 존재하는지 확인하자.
그리고, 개별 디렉토리에 각각의 shell script or link가 존재할 것이다.
만약 본인이 원하는 script가 하루에 한번 or 한시간에 한번 실행되기 바란다면 shell script작성한 후  아래의 디렉토리에 추가하면된다.

  1. cron.hourly  : 시간마다 실행
  2. cron.daily   :  일마다 실행
  3. cron.weekly : 1주일 마다 실행
  4. cron.monthly : 1달 마다 실행

$ ps aux | grep cron

$ ls /etc/cron*
/etc/crontab

/etc/cron.d:
anacron  popularity-contest

/etc/cron.daily:
0anacron  apt-compat    cracklib-runtime  google-chrome  man-db   passwd              samba                   upstart
apport    bsdmainutils  dpkg              logrotate      mlocate  popularity-contest  update-notifier-common

/etc/cron.hourly:

/etc/cron.monthly:
0anacron

/etc/cron.weekly:
0anacron  fstrim  man-db  update-notifier-common


1.2 cron shell script 작성예제

1시간 마다 실행할 shell script을 만든다고 가정하고 작성해보자.
좀 더 자세히 작성하고자 하면, 반드시 if를 넣어 실행될 조건을 찾아서 넣자.

$ sudo vi /etc/cron.hourly/chksize
#!/bin/sh

MY_PATH=/home/pi
LOG_PATH=$MY_PATH/log
LOG=$LOG_PATH/cron_$(date +%Y%m%d-%H%M-%S).log

time=$(date "+%Y-%m-%d %H:%M:%S")
echo "Check My SD Disk" >> $LOG
echo $time >> $LOG
REMAIN=`df | awk 'NR == 2 {print $4}'`
echo $REMAIN >> $LOG
echo "" >> $LOG
echo " TEST"

$ sudo chmod +x /etc/cron.hourly/chksize  // 실행추가 

Shell Script을 작성후 1시간을 기다릴수 없으므로, 직접 hourly 관련된 script를 전체 실행해보자.


  • 작성된 shell script TEST
$ sudo run-parts --report /etc/cron.hourly  // TEST 
/etc/cron.hourly/chksize:
TEST

LOG도 기록이 되고 있기 때문에 좋지만, Log 파일은 하나로 만드는 것이 좋겠다.
상위 Shell Script을 추후 수정

  • Shell Script 사용시 주의사항 
  1. #!/bin/sh  반드시 추가 
  2. 실행하는 주체가 root 이므로 $HOME 과 같은 본인의 USER를 사용하지 말자.
  3. chmod +x 실행모드 추가해야 실행됨  

1.3 cron의 세부 설정 및 구조 

cron의 구조를 살펴보고 이해하자.

$ vi /etc/crontab             
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )


  1. m : minute 0~59
  2. h : hour 0~23
  3. dom: day of month (1 ~30 설정)
  4. mon:  month 몇월에 실행할지도 설정가능  (1~12 or May )
  5. dow:  day of week (1~7 or Sun)
  6. user : root 동일 
  7. command :  test -x 실행가능한지 확인하고, run-parts로 실행 

만약 본인이 원하는 cron.directory를 추가하고 만들수도 있다.
  https://webdir.tistory.com/175

  • crontab을 이용한 세부설정 

$ crontab -e 
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# m h  dom mon dow   command
0 10 * * * /etc/cron.hourly/chksize

  https://jdm.kr/blog/2

anacron은 정확한 시각에 작업을 실행하는 용도가 아니라, 매일/매주/매달의 작업을 실행하기위해서 만들어졌다고 한다.
damon process가 존재하지 않으며, 상위 cron에서 정기적으로 실행되는 구조로 동작된다고하며, 분산화를 위해 사용한다고 한다.


$ vi /etc/anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1       5       cron.daily      run-parts --report /etc/cron.daily
7       10      cron.weekly     run-parts --report /etc/cron.weekly
@monthly        15      cron.monthly    run-parts --report /etc/cron.monthly


  https://soooprmx.com/archives/6786


댓글 없음 :