我有一些每天在 cron 中运行的 python 脚本。仅当我的脚本有STDERR 输出时,如何让 cron 向我发送电子邮件?我希望能够向多个收件人发送邮件,并为每个 cron 条目单独设置主题行。
我试过这个:
./prog > /dev/null | mail . . .
但它没有用——当没有 STDERR 时,我仍然收到空白电子邮件。我需要在脚本本身中执行此操作吗?
抱歉,如果这看起来很基本,我已经用谷歌搜索了很多,但似乎找不到简洁的答案。
对于 cron,您不需要通过邮件进行管道传输。cron 守护进程会自动将您的命令的任何输出邮寄给您。您的 crontab 条目应如下所示:
# every minute
* * * * * ./prog >/dev/null
如果没有 STDERR 输出,您将不会收到任何邮件。
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 传输到邮件的标准输入。普通管道是从标准输出到标准输入,所以解决这个问题的最简单方法是重定向:
{ /prog > /dev/null ; } 2>&1 | mail ...
或者由于重定向顺序混乱而不太清楚:
/prog 2>&1 > /dev/null | mail ...
文件测试将 -s
告诉您文件是否存在并且大小大于零。
./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi
如果您的 SCRIPT 有可能产生您希望收到通知的 STDERR 的命令,那么您需要在脚本本身中使用 mail 或 mailx 调用(如果是 else 或 )。cron 作业 STDOUT 和 STDERR 重定向仅适用于 cron 作业执行STDOUT 和 STDERR。hkmaly 在 n 上做对了