cron で > /dev/null して椅子を投げられないための3つの方法

(タイトルは釣りです)

いい加減、>/dev/null 2>&1と書くのをやめたらどうか - DQNEO起業日記 この記事のタイトルが twitter で流れてきたのを見て、「そうだ!出力を /dev/null に捨てるなんてとんでもないよね!」と思ってよく読んだら /dev/null に間違いなく捨てる方法だったのでつい

とつぶやいてしまったのですが、では出力を捨てないためにはどうすればいいのか。現時点での個人的ベストプラクティスを書き留めておきます。

デフォルト : メールで送る (MAILTO)

せっかく cron daemon がログを捨てないためにわざわざメールで送ってくれるのに、それを > /dev/null で踏みにじるとはひどい。

とはいえ、実行頻度が多かったり出力が大量だったりすると、メールが届きすぎ → フィルタで既読 or ゴミ箱直行 になってしまって、結局読まれない運命になります。

なので > /dev/null する人が多いのだと思いますが、実行結果を丸ごと捨ててしまってはトラブル時に何らログが残っていなくて、調査する人に椅子を投げられること請け合い。

ではどうするか。

コマンド実行失敗時のみ知りたい : cronlog を使う

id:kazuho さんの cronlog を使うと、実行したコマンドが異常終了した場合のみ、標準出力、標準エラー出力を吐き出すことができます。

* * * * * cronlog /path/to/command

死活監視など、成功時には何もしなくていいけど失敗時にはログをみたいような場合に非常に便利です。

実行するコマンドは、問題があった場合にきちんと異常終了 (終了コード 0 以外) するように作る必要があります。

syslog に記録 : logger コマンドに渡す

自前で >> /path/to/command.log などしてファイルに記録する手もありますが、

  • ログファイルをローテーションしたい
  • 多数のホストで実行する場合、ログを一カ所に集約したい

という場合に不便なので、logger(1) コマンドを使用して syslog に送って記録するのがおすすめです。

* * * * * /path/to/command 2>&1 | logger -t mycommand -p local0.info

これで syslog には時刻、ホスト名、tag と共に記録されるので、管理が楽になります。

Jun 13 09:18:16 localhost mycommand: output from mycommand

ログは捨てないで

個人的には cron の出力結果を /dev/null に捨ててしまう人には、たとえば Apacheaccess_log も error_log も出力しないで運用する気があるのか、と問いたいぐらいです。

あなたの仕込んだ cron がすっかり忘れ去られた頃に、そのシステムの障害調査を行う人のためにも、ログは捨てずに何らかの方法で記録しておいてくださいね。

他にも cron の出力を扱う便利な方法があれば教えてください!