cron 実行時エラーに気づくポイント3つ
用意してもらったVMを使ったときに、cron関係でいくつかツマヅイタので、メモしておきます。当たり前のものに限って、うまくいかない時に困ったりしません?
cron設定が悪くエラー発生していたのですが、それに気づかずという状況を、次のようなポイントに気づいて改善しました。
個別にエラー出力を取得する
ジョブのエラーを、個別のファイルに落としておくのが、良い方法なんだと思います(ログ運用の事も考える必要はでてきますが)。
0-59/10 * * * * /usr/bin/python /home/user/test.py >> /path/to/logfile
上記の場合は、標準エラー出力にでてる内容は出てこないので、次まで書いておくのがオススメ。
0-59/10 * * * * /usr/bin/python /home/user/test.py >> /path/to/logfile 2>&1
必要なれば、リダイレクト、STDOUT(標準出力)、STDERR(標準エラー出力)の組合せで、別々に管理するのもありですね。標準出力はファイルに書いて、標準エラー出力は、後述のメールにするなども組合せでは出来そうな感じ。
エラー メールが届かない
cronで実行されたジョブがエラーになった時、デフォルト(前述のようにファイルに出力していない等)ではローカルの実行者にメール通知がされます。MAILTOを指定しておけば、任意のアドレスにもおくれます。
しかし、サーバー上でメールサーバーが動作していないと配送されないので注意ですね。自分で用意してなかったので、postfixが動作していない状態だったので、エラーに気づかずという状態でした。 $ sudo /etc/init.d/postfix status などで状況チェック。
Redhat系だと chkconfig などのコマンドで、自動起動状況を確認しておきましょう。
$ chkconfig | grep postfix postfix 0:off 1:off 2:off 3:on 4:off 5:on 6:off
もし自動起動になってない場合には、こんな感じで起動時に動作するように変更。
$ sudo chkconfig --level 35 postfix on
/var/log/cron.log には実行ログのみ
ディストリビューションによるのかもしれませんが、Redhat6.xの場合は、実行時間、ユーザー名、コマンドといった内容です。
$ sudo cat /var/log/cron ... Nov 30 20:01:01 srv01 CROND[11016]: (root) CMD (run-parts /etc/cron.hourly) Nov 30 20:01:01 srv01 run-parts(/etc/cron.hourly)[11016]: starting 0anacron Nov 30 20:01:01 srv01 run-parts(/etc/cron.hourly)[11025]: finished 0anacron
ここだけ見てても、なんちゃっとジョブのエラーなどは、一切見れないという点を忘れずに
参考サイト
まず基本を押さえるには、ここがオススメ。
crontabを、ちゃんと再確認する時には、ここがオススメ。"crontab -r"恐ろしいですね。。。幸いまだ、遭遇してなかったので備えなければと。
エラー出力する際のリダイレクト記述が気になった時は、ここが詳しいです。なぜ "% command >file 2>&1" なんて書き方するの?と思った時にオススメ。
cronのログを、ちゃんと扱おうと思った時には、こちらがオススメ。logger コマンド、cronlog コマンドなど、初めて知りました。便利だなぁ。
cron で > /dev/null して椅子を投げられないための3つの方法 - 酒日記 はてな支店