cronが設定した時間どおりに実行されない場合の対処法

cron が crontab で設定した時間どおりに実行されないという現象に出くわして困ったのですが、何とか解決できたのでその方法を紹介しておきます。

まず、以下のような設定(1 分ごとに実行)をしてみると、期待したとおりに動いている様子。

* * * * * date >> /path/to/cron_check.txt

次に、以下のような設定(14 時台で 1 分毎に実行)をしてみると、14 時台にも関わらず実行されません。

* 14 * * * date >> /path/to/cron_check.txt

もしかしてタイムゾーンがズレているのかも、と思い、次のように仕込んでみました。

* 0 * * * echo '0' >> /path/to/cron_check.txt
* 1 * * * echo '1' >> /path/to/cron_check.txt
* 2 * * * echo '2' >> /path/to/cron_check.txt
* 3 * * * echo '3' >> /path/to/cron_check.txt
  :
* 22 * * * echo '22' >> /path/to/cron_check.txt
* 23 * * * echo '23' >> /path/to/cron_check.txt

すると 14 時台なのに、cron_check.txt に出力されたのは「0」。やはりタイムゾーンが狂ってるっぽいです。

NetBSD で cron の動作時間がずれる - CORY's twilight zone を参考にして、crontab の先頭に

TZ="Japan"

を追記してから

$ sudo /sbin/service crond restart

で cron のサービスを再起動したところ、無事、時間通りに実行されるようになったのでした。(TZ="Japan" の代わりに CRON_TZ="Japan" としてもうまくいきました。)

もし、同じような問題に出会った方は試してみてください。