如果有错误,我如何才能只接收来自 cron 的电子邮件?
在绝大多数情况下,任务都会运行得很好 - 我真的不关心输出。
只有在极少数失败的情况下我才想/需要知道。
我有程序邮件可用 - 但不确定我所描述的是否可以“正确”地从外部管理 cron。
答案1
命令chronic
来自更多实用程序静默运行命令,除非失败。
引用其手册:
chronic 运行命令,并安排仅在命令失败(非零退出或崩溃)时显示其标准输出和标准错误。如果命令成功,任何无关的输出都将被隐藏。
chronic 的常见用途是运行 cron 作业。您不必试图保持命令安静,并且在成功时必须处理包含意外输出的邮件,并且在失败时不必处理足够详细的输出,您可以始终详细地运行它,并使用chronic 来隐藏成功的输出。
答案2
由于您不关心输出,因此可以将作业的 STDOUT 重定向到/dev/null
并让 STDERR 通过邮件发送(使用MAILTO
环境变量)。
因此,例如:
...
...
[email protected]
...
...
* * * * * /my/script.sh >/dev/null
当仅在 STDERR 上有输出时(带有 STDERR),将发送邮件,并将丢弃 STDOUT。
当然,这是假设当程序在 STDERR 上写入时,已经失败;情况可能并非总是如此。如果您可以控制该程序,则可以让它这样做。对于任何复杂的情况,您应该编写某种类型的包装器来运行命令并相应地发送邮件。并将包装纸作为cron
工作。
答案3
如果有错误,我如何才能只接收来自 cron 的电子邮件?
你可以用以下方式包装你的 cron 调用慢性病,一个 shell 脚本,它会吃掉 cron 输出,除非被调用进程的返回码非零或存在非跟踪错误输出。
要使用 cronic,请将脚本下载到合适的位置,例如/usr/local/bin
.您的 crontab 条目必须以脚本路径为前缀(例如/usr/local/bin/cronic
),或者简单地添加cronic
,前提是您的PATH
设置正确。
请注意,“错误”在您的问题中是一个定义不明确的术语,需要仔细定义。为了使 cronic 有用,您必须确保使用 cronic 包装的作业以它定义错误条件的方式之一报告错误。隐式报告方法(例如将文本字符串写入STDOUT
)将需要进一步考虑以使其与 cronic 或其他 cron 报告机制兼容。
其他包装器也可用,如 cronic 站点链接所示:
答案4
我可能从始至终都没有想到这一点,但是
* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null
在普通情况下,将所有内容重定向到临时文件(您可能希望使用它mktemp
来获取唯一的文件名),如果文件成功则删除该文件,然后cat
再次删除内容(如果它们仍然存在)(即 yourthing.sh 退出有错误情况),由 cron 邮件程序接收。
如果内存正常,如果没有输出,cron 就不会发送任何内容,因此如果日志文件为空或不存在,则什么也不会发生。 (我们将错误消息重定向走。)