19

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

我试过这个:

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

但它没有用——当没有 STDERR 时,我仍然收到空白电子邮件。我需要在脚本本身中执行此操作吗?

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

4

6 回答 6

26

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

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

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

于 2009-09-08T21:59:45.490 回答
15

mail v1.6 可以选择不发送正文为空的消息:

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

这可能是您正在寻找的。

于 2010-03-05T20:17:18.103 回答
15

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

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

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

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

于 2011-01-04T14:08:06.033 回答
8

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

./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi
于 2009-09-08T22:13:52.543 回答
8

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

于 2012-05-30T17:49:27.983 回答
-2

如果您的 SCRIPT 有可能产生您希望收到通知的 STDERR 的命令,那么您需要在脚本本身中使用 mail 或 mailx 调用(如果是 else 或 )。cron 作业 STDOUT 和 STDERR 重定向仅适用于 cron 作业执行STDOUT 和 STDERR。hkmaly 在 n 上做对了

于 2012-06-21T16:18:44.860 回答