2011年2月12日土曜日

RHEL6 (7)cronとanacron


このエントリーをはてなブックマークに追加


RHEL6でのcron/anacronについて。
少々変わった部分があるので注意が必要。
Table of Contents
=================
  1 RHEL5の設定ファイル
  2 RHEL6の設定ファイル
  3 RHEL5と6の違い
  4 何が起きるか?
  5 そもそもanacronとは
  6 RHEL6のanacrontab
  7 RHEL6のcron/anacron の関係図解
  8 なんでこんな設定になっているか?
  9 RHEL6 cron/anacron 注意事項まとめ


1 RHEL5の設定ファイル
^^^^^^^^^^^^^^^^^^^^^^
[root@station1 ~]# ps -ef |grep cron
  root      1962     1  0 19:15 ?        00:00:00 crond
  root      2008     1  0 19:15 ?        00:00:00 anacron -s

  [root@station1 ~]# chkconfig --list |grep cron
  anacron         0:off   1:off   2:on    3:on    4:on    5:on    6:off
  crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off

  [root@station1 cron.daily]# cat /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


  [root@station1 cron.daily]# 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

  1       65      cron.daily              run-parts /etc/cron.daily
  7       70      cron.weekly             run-parts /etc/cron.weekly
  30      75      cron.monthly            run-parts /etc/cron.monthly


2 RHEL6の設定ファイル
^^^^^^^^^^^^^^^^^^^^^^
[root@localhost cron.hourly]# ps -ef |grep cron
  root      1339     1  0 19:00 ?        00:00:00 crond
  root      1417     1  0 19:01 ?        00:00:00 /usr/sbin/anacron -s

  [root@localhost cron.hourly]# chkconfig --list |grep cron
  crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off

  [root@localhost cron.d]# cat /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
  # |  |  |  |  |
  # *  *  *  *  *  command to be executed

  [root@localhost cron.d]# 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

3 RHEL5と6の違い
^^^^^^^^^^^^^^^^^

RHEL5まではcron.{daily|weekly|monthly} 以下の実行スクリプトは、crontabにて指定された時間に実行されていたが、RHEL6からは全てanacron配下に置かれている。

そのほか、RHEL5でanacronは個別のサービスとして登録されていたが、RHEL6ではcronによって制御されている。


4 何が起きるか?
^^^^^^^^^^^^^^^^^

この設定によってRHEL6で何が起きるかと言うと、cron.{daily|weekly|monthly} 以下におかれたスクリプトが「何時に実行されるかわからなくなる」。

特にログローテーションなんかは、RHEL5では毎日04:02に起動されていたが、RHEL6ではその時間に起動されない。

んじゃ、いつ実行されるのって事で、詳しくanacronの動きを調べてみることにする。


5 そもそもanacronとは
^^^^^^^^^^^^^^^^^^^^^^

crondをサポートするような機能。

crondは起動すると一分おきにcrontabを見に行って、起動条件に合致するものがあればそれを実行する。しかし、crondが起動していない時間は無視されてしまう。

例えば、毎日 23:00 にあるバッチを起動しているとする。何かの理由で 22:55~23:05の間、サーバをメンテナンス等で止めたとする。

この場合、当然ながらバッチは起動されない。これはこれで正しい動作なのだが、それでは困る場合にanacronへ設定を入れておくことでシステム起動後にバッチを遅延起動させる事ができる。

なので、上の設定を見るとRHEL5まではcronで実行されなかった場合、anacronで実行させるという設定になっていることが分かる。
RHEL5/crontab
  02 4 * * * root run-parts /etc/cron.daily

  RHEL5/anacrontab
  1       65      cron.daily              run-parts /etc/cron.daily
設定の意味:
 1カラム目:何日おきに実行するか?

 2カラム目:1カラム目で指定された期間実行されていなかった事を検知した場合、次に処理を実行する場合の遅延時間

 3カラム目:識別子 /var/spool/anacron 以下のこの名前のファイルが作成される。anacronは処理を実行するとこのファイルに実行された日付を書き込む

 4カラム目:実行する処理

この辺りに詳細に書いてある。
http://www.itmedia.co.jp/help/tips/linux/l0560.html
http://www.jp.redhat.com/manual/Doc9/rhl-cg-ja-9/s1-autotasks-anacron.html

6 RHEL6のanacrontab
^^^^^^^^^^^^^^^^^^^^

RHEL6のanacrontabは以下のようになっているので、
# 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

  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.daily は 以下の条件で起動される。

1. anacronが起動されたタイミングで
2. /var/spool/anacron/cron.daily に記載された日付が、現在時刻より1日以上前の状態で
3. 3-22時の場合に
4. 遅延5分+ランダム時間(0-45分)待った後に実行される。

*anacronはcron.houry経由で1時間おきに起動される。

7 RHEL6のcron/anacron の関係図解
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

標準インストール後の状態を図にまとめてみた。



8 なんでこんな設定になっているか?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

当然ながらなんでこんな設定になったかは理由がある。
聞いた話では、RHEL6は仮想環境で動かされる(ゲストとして稼働する)事を強く意識しており、
同一ホストで複数のRHELが動いている場合に、同じ時間に一斉にログローテーションが走る事を避けるため(らしい

同じような仮想化環境下での負荷軽減の仕組みとして、Tickless という割り込み頻度を下げる仕組みも導入されている。

参考>> http://cloud.watch.impress.co.jp/docs/column/virtual/20101129_409089.html


9 RHEL6 cron/anacron 注意事項まとめ
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1. cron.{daily|weekly|monthly} 以下に置いたファイルは、
実行時間が指定されていないため、いつ実行されるかわからない。

2. 明示的に実行タイミングを指定したい場合は、
/etc/cron.d
/etc/crontab
/var/spool/cron (crontab -e)

にて指定すること。

3. デフォルト登録されているログローテーション等の処理時間を固定化したい場合、crontabに実行時間を書くと、今までどおりの動作になる。

0 件のコメント:

コメントを投稿