home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/Linux/CentOS/CentOS6でのcron, anacron

技術/Linux/CentOS/CentOS6でのcron, anacron

技術 / Linux / CentOS / CentOS6でのcron, anacron
id: 1319 所有者: msakamoto-sf    作成日: 2014-09-22 19:58:20
カテゴリ: Linux 

以前、ローカルで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 までそのマシンが停止するケースだと、以下のような動きになる。

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パッケージが提供している。

# 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

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:

# 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:

...
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

参考リンク



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2014-09-22 19:58:51
md5:cfb9e77deac265ce91694013c0172a83
sha1:1f78e4f3dce2922483e622d50ead4fcb9f1913dc
コメント
コメントを投稿するにはログインして下さい。