본문으로 바로가기

[CentOS] Anacron

category 리눅스/CentOS 2013. 7. 5. 01:00

RHEL6에는 정기 작업의 실행에 anacron이 채용되어 있습니다. 그의 공개 배포판인 CentOS6 에서도 적용되어 있습니다.

anacron

anacron은 정확한 시각에 작업을 실행하는 용도가 아니라 매일, 매주, 매달의 작업을 '적절한 타이밍'에 실행하기 위한 명령어이다.

RHEL5에서는 cron 작업을 이용하여 1시간마다 혹은 매일, 매주, 매달 이런 식으로 정기 작업을 실행했다. 구체적으로는 /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 이하의 디렉토리에 작업을 실행하는 쉘 스크립트를 배치한다.

RHEL5 에서는 아래와 같은 /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

cron은 서버가 중단되었다가 다시 시작되면 중단 된 기간동안에 실행되지 않았던 작업들이 밀려 있게 되고 Linux KVM에 의한 서버가상화 환경에서 한 대의 물리 서버에 게스트 OS인 RHEK5가 동시에 작업을 시작하면, 물리 서버에 대한 부하가 집중될 가능성이 있다.

위와 같은 문제로 인해 /etc/crontab의 설정을 변경하여 작업 시각을 분산할 필요가 있다.

RHEL6에서는 이 문제를 회피하기 위해 매일, 매주, 매달의 정기 작업을 cron이 아닌 anacron 명령어를 이용해서 실행하도록 바뀌어 있다. 디폴트로 RHEL6의 anacron 명령어의 설정 파일은 /etc/anacrontab에 위치해 있다.

cat /etc/anacrontab

  # /etc/anacrontab: configuration file for anacron
  # See anacron(8) and anacrontab(5) for details.

  SHELL=/bin/sh
  PATH=/sbin:/bin:/usr/sbin:/usr/bin
  MAILTO=root

  # the maximal random delay added to the base delay of the jobs
  RANDOM_DELAY=45

  # the jobs will be started during the following hours only
  START_HOURS_RANGE=3-22

  #period in days   delay in minutes   job-identifier   command
  1       5       cron.daily              nice run-parts /etc/cron.daily
  7       25      cron.weekly             nice run-parts /etc/cron.weekly
  @monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

cron 작업은 상주형 데몬인 crond에 의해 정기적으로 실행되지만, anacron은 데몬이 아니다. 누군가가 명시적으로 anacron 명령어를 실행한 타이밍에서 실행이 필요한 작업이 있으면 그 작업을 실행한다.

작업을 실행하면 'job-identifier'로 지정된 파일 /var/spool/anacron/<job-identifier>에 날짜를 적음으로써 마지막 작업의 실행일을 기록한다.

ls -la  /var/spool/anacron

  합계 20
  drwxr-xr-x. 2 root root 4096 2013-05-28 01:54 .
  drwxr-xr-x. 8 root root 4096 2013-05-28 01:54 ..
  -rw-------. 1 root root    9 2013-07-04 03:09 cron.daily
  -rw-------. 1 root root    9 2013-07-02 18:21 cron.monthly
  -rw-------. 1 root root    9 2013-07-02 18:01 cron.weekly
cat cron.daily && cat cron.weekly && cat cron.monthly

  20130704
  20130702
  20130702

anacron을 재실행하면 마지막의 작업 실행 일에서 'period in days' 이상의 날짜가 경과했을 경우 그 작업도 재실행한다. 위의 경우 정확하게 날마다, 주마다, 달마다 세개의 run-parts 명령어가 각각 실행되게 된다.

RHEL6에서는 cron 작업을 이용해 anacron이 실행된다. /etc/cron.hourly 이하에 있는 쉘 스크립트 0anacron에 의해 매시 01분에 anacron 명령어가 실행된다.

 cat 0anacron

  #!/bin/bash
  #in case file doesn't exist
  if test -r /var/spool/anacron/cron.daily; then
        day=`cat /var/spool/anacron/cron.daily`
  fi
  if [ `date +%Y%m%d` = "$day" ]; then
      exit 0;
  fi

  # in case anacron is already running,
  # there will be log (daemon won't be running twice).
  if test -x /usr/bin/on_ac_power; then
      /usr/bin/on_ac_power &> /dev/null
      if test $? -eq 1; then
      exit 0
      fi
  fi
  /usr/sbin/anacron -s

이 방식의 경우 각 작업의 실행 간격은 정해져 있지만, 작업의 실행 시각은 특별히 정해져 있지 않다는 점에 주의해야 한다. 예를 들어, 장기간 정지되어 있는 서버를 가동하면 최초의 01분의 타이밍에 모든 작업이 실행된다. 또한, 작업의 실행을 허락하는 시간대를 'START_HOURS_RANGE'로 지정하도록 되어 있다.

위에서는 새벽 3시~22시까지에만 실행이 허가되어 있다. 이때 anacron이 있는 작업을 실행하려고 한 타이밍에서 'delay in minutes'에 지정된 만큼의 시간 이후 실제로 작업이 실행되어 작업이 분산된다.

cron과 anacron의 특징을 정리하면 아래와 같다.

cron의 특징

  • 요일, 시, 분, 초의 단위로 지정 시각에 작업을 실행한다.
  • 지정 시각에 서버가 정지한 경우 등에 실행하지 않은 작업을 재실행하는 기능은 없다.
    (다음 차례의 지정 시각까지 기다릴 필요가 있음)
  • /etc/crontab, /etc/cron.d/ 이하의 파일, 각 유저의 crontab 파일등 복수의 작업 설정 장소가 있다.
  • 데몬 프로세스(crond)가 상주하여 지정 시각에 작업을 가동한다.


anacron의 특징

  • 작업의 실행 간격을 1일 단위로 지정한다.
    (1일 1회 이상 실행빈도는 설ㄹ정 불가, 명시적인 실행 시각 지정 불가)
  • 작업의 설정 장소는 /etc/anacrontab만 가능하며, 루트 유저 이외는 작업의 설정이 불가.
  • 작업의 실행 타이밍에 랜덤으로 연장 시간이 추가된다.
  • 데몬 프로세스가 존재하지 않으므로 정기적으로 anacron 명령어를 실행하는 구성을 따로 준비.
    (cron의 매시 01분에 anacron을 실행하는 명령어가 기본으로 추가되어 있다.)
  • 장기간 서버가 정지된 경우는 서버 가동 후에 필요한 작업을 바로 할 수 있다.


'리눅스 > CentOS' 카테고리의 다른 글

[CentOS] Apache(아파치) 구조  (0) 2013.07.09
[CentOS] PHP - APC 설정  (0) 2013.07.05
[CentOS] 방화벽 설정 - iptables  (65) 2013.07.01
[CentOS] APM 설치 - yum  (8) 2013.07.01
[CentOS] Gmail의 SMTP를 사용한 메일전송  (2) 2013.06.27