AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

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つの方法 - 酒日記 はてな支店