以前、ローカルでCentOS 6.3をDVDイメージからセットアプしたときは気づかなかったが、最近AWSのEC2で、Marketplace提供のCentOS 6.4 or 6.5のAMIを使ってみたら気づいた。
実行形態
cronとanacronの違いの例として、毎日 03:00 に実行するジョブをcronとanacronとでそれぞれ登録してみる。anacronは毎時5分に "/etc/cron.hourly" ディレクトリ以下のスクリプトにより、cronから実行される。
/etc/crontab
0 3 * * * root /foo/bar/job.sh
/etc/anacrontab
... # anacronの場合は、ぴったり何時に実行ではなく、実行する時間帯を指定。3時-5時に設定。 START_HOURS_RANGE=3-5 #period in days delay in minutes job-identifier command 1 5 foo.job /foo/bar/job2.sh
メンテナンスのため00:00 - 04:00 までそのマシンが停止するケースだと、以下のような動きになる。
00:00 - マシンシャットダウン 03:00 - シャットダウン中なので、cronもanacronも実行されない。 04:00 - マシン起動 04:05 - cron.hourlyによりanacronが実行される。 → START_HOURS_RANGE内なので、"foo.job"の前回起動した日時を /var/spool/anacron/(job-identifier) ファイルから読み取り、 "period in days" 経過していれば実行する。
このように、cronではジョブ実行時間帯にマシンが停止していればそのジョブは実行されない。
anacronであれば、日数間隔で大雑把にはなるが、マシンが起動したあとの最初のanacron実行時に、停止している間に実行されるべきだったジョブを実行できる。
cron が、vixie-cron から Fedoraプロジェクトでforkされた cronie というパッケージに変更されている。
CentOS 6.4 AWS Marketplace AMI (yum update後):
# rpm -qa | grep cron cronie-1.4.4-12.el6.x86_64 crontabs-1.10-33.el6.noarch cronie-anacron-1.4.4-12.el6.x86_64
crondデーモン本体を cronie が、スケルトンの crontab ファイル・ディレクトリを crontabsパッケージが提供している。
# rpm -ql cronie /etc/cron.d/0hourly /etc/cron.deny /etc/pam.d/crond /etc/rc.d/init.d/crond /etc/sysconfig/crond /usr/bin/crontab /usr/sbin/crond ... /var/spool/cron
/etc/cron.d/0hourly:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 01 * * * * root run-parts /etc/cron.hourly
crontabsパッケージの内容:
# rpm -ql crontabs /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly /etc/crontab /usr/bin/run-parts /usr/share/man/man4/crontabs.4.gz
/etc/crontab:
# more /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
anacronの実行ファイルと、デフォルトの、cron.hourlyでanacronを実行するためのcron設定ファイルが cronie-anacronパッケージでインストールされる。
# rpm -ql cronie-anacron /etc/anacrontab /etc/cron.hourly/0anacron /usr/sbin/anacron /usr/share/man/man5/anacrontab.5.gz /usr/share/man/man8/anacron.8.gz /var/spool/anacron /var/spool/anacron/cron.daily /var/spool/anacron/cron.monthly /var/spool/anacron/cron.weekly
/etc/anacrontab:
# more /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
デフォルトでは START_HOURS_RANGE が 3時~22時と非常に広いレンジになっている。
考え方としては、CentOSをインストールしたのが 3時~22時の間であればその間のcron.hourlyにより、最初のanacronジョブが実行される。
23時以降も cron.hourly で起動されるが、START_HOURS_RANGE外なのでジョブは実行されない。
3時になって cron.hourly によりanacronが実行されると、START_HOURS_RANGE内に入ったので、ジョブが実行される。
そのさい、"delay in minutes" で遅延した後に、さらにRANDOM_DELAYで指定した分数の間、ランダムの分で遅延してジョブが実行される。
整理すると、以下のように事実上、anacronが "/etc/cron.daily", "/etc/cron.weekly", "/etc/cron.monthly" を実行している。
/etc/crontab : 空っぽ /etc/cron.d/ 0hourly : 毎時1分に "/etc/cron.hourly" 以下を実行 /etc/cron.hourly/ 0anacron : anacron 実行
→ crond自身は上記まで、つまり "/etc/cron.d/0hourly" 経由で "/etc/cron.hourly/" までがcrondの範囲。
"/etc/cron.(daily|weekly|monthly)" は、以下のようにanacron経由で実行される。
/etc/anacrontab:
... 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
cronie-noanacronをインストールして、代わりにcronie-anacronを削除すれば良いらしい。
yum install cronie-noanacron yum remove cronie-anacron
コメント