我在 Debian 上有一个 cron 作业:
1 * * * * /home/paradroid/bin/myscript.sh >/dev/null
有一个安装和配置的MTA,当脚本有语法错误时我收到了电子邮件,所以我一直认为当出现任何问题时我会收到通知。
curl
该脚本通过代理下载文件。最近代理失效,curl
无法下载。这是脚本中的最后一个命令,已退出并显示错误代码 7。
我以为发生这种情况时我会收到电子邮件,但我没有。
为什么我会收到来自脚本中语法错误之类的电子邮件警报,但当脚本无法完成其工作并以错误代码退出时我却没有收到这些警报?
有什么问题吗,或者当出现错误时我是否必须让脚本直接向我发送电子邮件curl
?
答案1
我假设您的 cron 电子邮件设置全部正确,并且您会收到电子邮件。
您将所有 stdout 发送到/dev/null
,因此任何打印错误消息的内容都必须将它们输出到 stderr 。您可能想确保脚本中的所有内容都正确输出。
有时我不得不使用第三方代码,该代码将所有内容发送到标准输出。在这种情况下,我通常会进行错误检查。它并不漂亮,但大多数 shell 脚本也不漂亮。
答案2
在与 Freenode上的一些人交谈后,一位开发人员提到大约十年来(7.23.0 之前)#curl
存在一个错误,其中选项解析错误将( ) 视为( ),因此所有输出都被抑制,包括.curl
-Ss
--show-silent --show-error
-s
--silent
stdout
解决方案(7.23.0 之前)是使用-sS
替代或长选项。
这个讨厌的 bug 给我带来了很多困惑,并让一个相当重要的 cron 作业在我不知情的情况下失败了好几天!
答案3
如果包含输出,Cron 仅通过电子邮件向您发送输出流 stdout 和 stderr。
您可以通过对程序的返回代码执行 echo 条件来触发 cron 来通知您。这确实假设程序适当地设置了故障状态。这可以通过添加|| echo Failure status $?
到命令行的末尾来完成。根据您的喜好调整消息。长格式是用构造包装命令if
then
fi
或在命令运行后测试返回代码。