#navi_header|技術| 以前、ローカルでCentOS 6.3をDVDイメージからセットアプしたときは気づかなかったが、最近AWSのEC2で、Marketplace提供のCentOS 6.4 or 6.5のAMIを使ってみたら気づいた。 * cronとanacronの違い :cron: 指定された時間と間隔でジョブを実行する。分単位で指定できる。マシンが起動している間のみ、ジョブを実行する。 :anacron: 指定された日数間隔でジョブを実行する。マシンが停止していたら、その間の日数を計算してジョブを実行する。 実行形態 - cron : デーモンとして常時起動している。 - anacron : anacron自体は常時起動せず、cronからcron.hourlyなどで定期的に起動される。 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 までそのマシンが停止するケースだと、以下のような動きになる。 #pre||> 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実行時に、停止している間に実行されるべきだったジョブを実行できる。 * 最新 CentOS 6 での cron, 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 ** cronie, crontabsパッケージ crondデーモン本体を cronie が、スケルトンの crontab ファイル・ディレクトリを crontabsパッケージが提供している。 #pre||> # 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: #pre||> # 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 ||< ** cronie-anacronパッケージ 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: #pre||> # 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で指定した分数の間、ランダムの分で遅延してジョブが実行される。 * CentOS 6 での cron, anacron 実行順序の整理 整理すると、以下のように事実上、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: #pre||> ... 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 ||< * CentOS5時代のcrondのみによる制御に戻すには cronie-noanacronをインストールして、代わりにcronie-anacronを削除すれば良いらしい。 yum install cronie-noanacron yum remove cronie-anacron * 参考リンク - https://fedorahosted.org/cronie/ -- Fedoraで分岐したcronieの開発サイト - anacronふたたび。(「RHEL6で悩ましい諸々」シリーズ) - めもめも -- http://d.hatena.ne.jp/enakai00/20111004/1317718773 - cronとanacronとRHEL5系6系 | ツチノコブログ -- http://tsuchinoko.dmmlabs.com/?p=791 - CentOS6以降でcron.dailyなどが適当な時間で起動するのを変更する | Hack -- http://hack.aipo.com/archives/420/ - ALL about Linux: CentOS6 の cron.daily 実行時刻を CentOS5 以前と同様に設定する -- http://luna2-linux.blogspot.jp/2013/01/centos6-crondaily-centos5.html - CentOS 6.2 crondとanacronの関係について調べてみた - gitrhythm.net -- https://gitrhythm.heroku.com/blog/2012/02/20/centos62-crond-and-anacron/ - RHEL 6のジョブスケジューラ「anacron」とは Part1 | 技術ブログ| レック・テクノロジー・コンサルティング株式会社 -- http://www.reqtc.com/column/anacron1.html - OSSはアルミニウムの翼で飛ぶ: RHEL6 (7)cronとanacron -- http://aikotobaha.blogspot.jp/2011/02/rhel6-7cronanacron.html - CentOS6.4のCronインストール・URLを自動実行 | WebEngineeer -- http://www.webengineeer.com/cron/ - CentOS6でanacronの時間を夜間のみに限定する | Hack -- http://hack.aipo.com/archives/3171/ #navi_footer|技術|