anacron

anacronは電源が落ちている間に動くはずだったジョブを実行するcronという程度の認識でいたが、動作を良く理解していないことに気づいた。anacronについて詳しく調べてみることにする。

anacron(8)を読んで次のことがわかった。

  • anacrontabには期間(日)、delay(分)、一意な識別子、シェルコマンドを順に書く。
  • 期間に設定した日数だけコマンドが実行されていなければdelayに設定した時間(分)だけ待ってからに実行する。
  • 前回実行した日の確認は/var/spool/anacron/$idのタイムスタンプを見る。タイムスタンプの使われる部分は日付だけで時は使われない。
  • 実行が終わったところでファイルのタイムスタンプは更新される。
  • 実行すべきジョブが無くなったらanacronは終了する。
  • 引数に識別子を与えると処理するジョブを限定できる(?) 後述
  • -dを与えない限り、子プロセスを作り親プロセスは直ちに終了して制御を戻す。
  • -sと-nを与えない限り、全てのジョブが独立してdelayだけ経った後に実行される。
    • -sを与えるとジョブの実行がシリアライズされる。
    • -nを与えるとdelayを無視してジョブが直ちに実行される。
  • 出力をメールで送信するあたりは多分cronと同じ。
  • syslogにはcronのファシリティで送られる。
  • 実行されることが決まってdelayの経過待ちあるいは現在実行中のジョブはロックされて、もう一個anacronを起動しても同時に実行されることはない。

次の部分の意味が始めよくわからなかったので訳してみた。あっているだろうか。

Anacron only considers jobs whose identifier, as specified in the anacrontab matches any of the job command-line arguments. The job arguments can be shell wildcard patterns (be sure to protect them from your shell with adequate quoting). Specifying no job arguments, is equivalent to specifying "*" (That is, all jobs will be considered).
-- anacron(8)

識別子(これはanacrontabに記述される)がコマンドライン引数のいずれかとマッチするジョブをAnacronは処理するのみである。ジョブ引数にはシェル・ワイルドカード・パターン(必ず引用符で適切に括ってシェルからそれらを保護せよ)を用いることができる。ジョブ引数を与えないのは、"*"(つまり全てのジョブが処理されることになる)を与えるのと同等である。


ここまで調べていくつか疑問が生じた。

  • 上で調べた限りanacron(8)はデーモンではないようである。定期的に実行するために誰がanacron(8)を起動するのだろうか。
  • 実行前に待つのは何のためだろうか。


誰が起動するのかについてであるが、READMEではシステムの起動スクリプト及びcronの日ごとのジョブで実行するように勧めている。

It is recommended to run Anacron from the system boot-scripts. This way the jobs "whose time has come" will be run shortly after the machine boots. A delay can be specified for each job so that the machine isn't overloaded at boot time.

In addition to running Anacron from the boot-scripts, it is also recommended to schedule it as a daily cron-job (usually at an early morning hour), so that if the machine is kept running for a night, jobs for the next day will still be executed.

手元のUbuntu 9.04とCentOS 5.3で調べてみた。
Ubuntuでは、init.dにanacronを起動するスクリプトが置かれ、cron.dからinit.dに置かれたスクリプトを起動するようになっており、/etc/cron.{daily,weekly,monthly}はanacronがインストールされている場合cronからは起動されないようになっていた。
CentOSでも、init.dにanacronを起動するスクリプトが置かれているが、cron.dailyでanacronを-uオプション付きで起動してタイムスタンプを更新するだけに設定されており、/etc/cron.{daily,weekly,monthly}はcronが実行するようになっていた。


ではdelayだけ待つのは何のためであろうか。READMEには(上で引用した中にあるが)A delay can be specified for each job so that the machine isn't overloaded at boot time.と書いてあるのを見つけた。起動時の負荷対策のためらしい。