Cron用STDERR发送电子邮件但不是STDOUT?

时间:2009-09-08 21:50:17

标签: email scripting cron stderr

我有一些python脚本每天在cron中运行。如果我的脚本中有STDERR OUTPUT ,我怎么能让cron给我发电子邮件?我希望能够邮寄多个收件人,并为每个cron条目单独设置主题行。

我试过了:

./prog > /dev/null | mail . . . 

但它不起作用 - 当没有STDERR时我仍然收到空白的电子邮件。我是否需要在脚本本身中执行此操作?

对不起,如果这看起来很基本,我已经google了很多,但似乎无法找到这个答案。

6 个答案:

答案 0 :(得分:26)

对于cron,您不需要通过邮件管道。 cron守护程序将自动将您命令的任何输出邮寄给您。您的crontab条目应如下所示:

# every minute
* * * * * ./prog >/dev/null

如果没有STDERR输出,您将不会收到任何邮件。

答案 1 :(得分:15)

你问的是不正确的问题。当您使用mail(1)发送电子邮件时,它与cron不再相关。你真正需要的是将stderr传递给邮件的stdin。普通管道是从stdout到stdin,解决这个问题的最简单方法是重定向:

{ /prog > /dev/null ; } 2>&1 | mail ...

或者由于重定向顺序混乱而不太清楚:

/prog 2>&1 > /dev/null | mail ...

答案 2 :(得分:13)

mail v1.6可以选择不发送空体消息:

 -E      Do not send messages with an empty body.  
         This is useful for piping errors from cron(8) scripts.

这可能就是你要找的东西。

答案 3 :(得分:8)

-s文件测试将告诉您文件是否存在且大小是否大于零。

./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi

答案 4 :(得分:8)

有一个名为cronic的好工具可以做到这一点。它是moreutils包的一部分。

答案 5 :(得分:-2)

如果您的SCRIPT具有可能产生您希望收到通知的STDERR的命令,那么您需要在脚本本身内使用mail或mailx调用(如果是其他的话)。 cron作业STDOUT和STDERR重定向仅适用于cron作业 EXECUTION STDOUT和STDERR。 hkmaly把它放在了n