cron の実行ログをすてさせないライフハックできたよー
昨今、cron のログにかんする話がちょいちょいありますが、問題点をまとめると
- stdout or stderr に1バイトでも書くとメールがとぶ
- インタープリタのだす warnings や printf デバッグの名残りなどでもメールがいちいちとんでめんどくさい
- めんどくさいから出力を /dev/null にほうむりがち
- ログを /dev/null にすてると運用にさしつかえる
といったところかとおもいます。
これにたいする一般的なソリューションとして、かずほさんの cronlog というのがあって、これは exit status をみて stdout/stderr の出力を /dev/null または任意のファイルにおくってメールをとばさせないというソリューションです。
cronlog は便利なのだけど、毎行設定するのだるいという問題があるので、設定が簡単なように cron に以下のようなパッチをあてるのはどうでしょうか。
MAILTO=logs@example.xxx
FAIL_MAIL_ONLY=1
とか先頭にかいておくだけで、exit status 0 のときはメールおくらない仕様になって便利。
diff --git a/do_command.c b/do_command.c
index 18d097d..4834908 100644
--- a/do_command.c
+++ b/do_command.c
@@ -129,7 +129,7 @@ child_process(e, u)
int stdin_pipe[2];
FILE *tmpout;
register char *input_data;
- char *usernm, *mailto;
+ char *usernm, *mailto, *fail_mail_only;
int children = 0;
pid_t job_pid;
@@ -153,6 +153,7 @@ child_process(e, u)
*/
usernm = env_get("LOGNAME", e->envp);
mailto = env_get("MAILTO", e->envp);
+ fail_mail_only = env_get("FAIL_MAIL_ONLY", e->envp);
/* Check for arguments */
if (mailto) {
@@ -523,6 +524,8 @@ child_process(e, u)
getpid(), (long) pos))
if (pos == 0)
goto mail_finished;
+ if (fail_mail_only && *fail_mail_only && status == 0)
+ goto mail_finished;
// get name of recipient.
if (mailto == NULL)
Published: 2012-06-06(Wed) 19:41