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