Email Cron使用STDERR而不是STDOUT发送电子邮件?

Email Cron使用STDERR而不是STDOUT发送电子邮件?,email,scripting,cron,stderr,Email,Scripting,Cron,Stderr,我有一些每天在cron中运行的python脚本。如何让cron仅在脚本中有STDERR输出时才向我发送电子邮件?我希望能够向多个收件人发送邮件,并为每个cron条目分别设置主题行 我试过这个: ./prog > /dev/null | mail . . . 但它不起作用——当没有标准时,我仍然收到空白电子邮件。我需要在脚本本身中执行此操作吗 很抱歉,如果这看起来很简单,我已经在谷歌上搜索了很多,但似乎找不到简洁的答案。对于cron,您不需要通过邮件传递信息。cron守护进程将自动向您发

我有一些每天在cron中运行的python脚本。如何让cron仅在脚本中有STDERR输出时才向我发送电子邮件?我希望能够向多个收件人发送邮件,并为每个cron条目分别设置主题行

我试过这个:

./prog > /dev/null | mail . . . 
但它不起作用——当没有标准时,我仍然收到空白电子邮件。我需要在脚本本身中执行此操作吗


很抱歉,如果这看起来很简单,我已经在谷歌上搜索了很多,但似乎找不到简洁的答案。

对于cron,您不需要通过邮件传递信息。cron守护进程将自动向您发送命令的任何输出。您的crontab条目应该如下所示:

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

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

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

./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi
/prog>/dev/null 2>some/file;如果[-s一些/文件];然后邮寄
mail v1.6有一个选项,可以不发送正文为空的邮件:

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

这可能就是您要找的。

您问的问题不正确。当您使用mail(1)发送电子邮件时,它在cron中的位置不再相关。您实际需要的是将stderr传输到邮件的stdin。普通管道是从标准输出到标准输入的,所以解决这个问题的最简单方法是重定向:

{/prog>/dev/null;}2>&1 |邮件…

或者由于重定向顺序混乱,以不太清晰的方式:


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

有一个很好的工具可以实现这一点。它是程序包的一部分。

如果脚本中的命令可能会生成您希望得到通知的STDERR,则需要在脚本本身中使用mail或mailx调用(If-then-else或)。cron作业STDOUT和STDERR重定向仅用于cron作业执行STDOUT和STDERR。hkmaly在n

“如果没有STDERR输出,您将不会收到任何邮件。”如果我将MAILTO设置为=,则是这样me@mine". 但是,如果管道发送到邮件(1),则不正确。“除了LOGNAME、HOME和SHELL之外,cron还将查看MAILTO,看它是否有任何理由因为在'this'crontab中运行命令而发送邮件。”--但是,我需要设置邮件的主题,而使用cron本身无法做到这一点(IMHO)。因此,我一直在使用邮件,这让我们回到了我最初的问题。这种方法的问题是,它假设
stdout
在出现错误时不包含任何有用的信息
cronic
解决方案更适合我。我最终使用了这种方法的变体。谢谢你,我找到了一篇关于这方面的好文章,这篇文章对我很有帮助。。很好的回答和将stderr和stdout都指向mail命令的适当技术。第二个示例将stdout放在地板上,只将stderr发送给mail命令。我认为这就是目的。在我的Ubuntu 12.04上,它是捆绑在
moreutils
中的
chronic
,它是用perl编写的,而不是用bash编写的,但似乎有同样的目的。无论如何谢谢你<如果程序带错误退出,code>chronic似乎同时输出STDOUT和STDERR,如果程序干净退出,则两者都不输出。那对我不起作用。我想要一个过滤掉STDOUT的
慢性
,独立于退出代码。一个简单的重定向最适合我。请注意,
cronic
chronic
的行为是不同的:
chronic
moreutils
,Perl)如果退出代码为0,则不会输出任何内容,即使STDERR上有内容
cronic
(,bash)在STDERR上有内容时输出所有内容,即使退出代码为0。