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

g33*_*z0r 19 email scripting cron stderr

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

我试过这个:

./prog > /dev/null | mail . . . 
Run Code Online (Sandbox Code Playgroud)

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

对不起,如果这看起来很基本,我已经google了很多但似乎无法找到这个简单的回答.

Shi*_*zmo 26

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

# every minute
* * * * * ./prog >/dev/null
Run Code Online (Sandbox Code Playgroud)

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

  • “如果没有 STDERR 输出,您将不会收到任何邮件。” 确实如此,如果我设置 MAILTO="me@mine"。但是,如果通过管道传输到 mail(1),则情况并非如此。“除了 LOGNAME、HOME 和 SHELL 之外,如果在‘this’ crontab 中运行命令而有任何原因需要发送邮件,cron 还会查看 MAILTO。” -- http://ss64.com/osx/crontab.html 但是,我需要设置邮件的_subject_,而 cron 本身无法做到这一点(恕我直言)。所以我被困在使用邮件,这让我们回到了我原来的问题。 (2认同)
  • 这种方法的问题是它假设“stdout”在发生错误时不会包含任何有用的信息。“cronic”解决方案对我来说效果更好。 (2认同)

Jay*_* P. 15

mail v1.6有一个选项,可以不发送带有空体的消息:

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

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


小智 15

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

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

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

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


mob*_*mob 8

-s 文件是否存在,并有大小大于零档测试会告诉你.

./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi
Run Code Online (Sandbox Code Playgroud)


Pau*_*rth 8

有一个很好的工具叫做cronic就是这样做的.它是moreutils包的一部分.

  • 在我的Ubuntu 12.04上,它是在``moreutils``中捆绑的``chronic``(不是``cronic``),它用perl而不是bash编写,但似乎有相同的目的.不管怎么说,还是要谢谢你 ! (2认同)