接收失败的 cron 作业通知

接收失败的 cron 作业通知

我担心 cron 作业可能会在 vanilla Ubuntu Desktop 12.04.1 (Precise) 上无限期地默默失败,而且没有人会注意到。我希望在系统 cron 作业打印某些输出或失败时收到通知。

我知道可以安装邮件服务器(例如 postfix),将其配置为仅本地传送,设置别名以便将 root 的邮件传送到我的普通用户帐户,并配置邮件客户端来检查我的本地邮箱。

Ubuntu 中是否有此解决方案的轻量级替代方案?

答案1

您可以将 cronjob 命令的错误输出重定向到文件。以下是 中的一行示例/etc/crontab

01 3    * * *   user    /bin/command 2>> /var/log/some.file

这样,如果发生错误,您至少会得到一些线索。您甚至可以编写一个脚本,在文件更改时通过notify-osd或类似工具通知您。

编辑:

该文件/var/log/syslog还会报告来自 cron 的消息。您可能想看一下。要获取 cron 守护进程的专用日志文件,请编辑/etc/rsyslog.d/50-default.conf并取消注释/编辑以下行:

#cron.*             /var/log/cron.log

不知道您会在那里发现什么,但值得一试。报告进展如何。

答案2

“我希望每当系统 cron 作业打印某些输出或者失败时都收到通知。”

我建议使用某种 cron 监控工具。市面上有不少这样的工具,但我目前使用的是 Dead Man's Snitch (https://deadmanssnitch.com) 并喜欢它。当 cron 作业未签入时,它会提醒您。就像您所做的那样,只需在作业后 curl 您唯一的告密 URL 并点击该 URL。还有一些其他的,如 probyapp,但它们不是免费的……祝你好运。

答案3

Jenkins 是这类事情的一个相当有用的工具。我知道人们倾向于将它视为 CI,但它实际上只是一个作业执行工具。它将捕获作业的输出、运行时间和退出代码状态,并根据这些状态确定作业是否失败。

您可以设置 ssh-agent 让 Jenkins 连接到远程机器,像 cron 一样安排作业运行,根据运行时间(而不是“凌晨 3 点”)自动间隔它们,链接依赖关系,根据每个作业轮换输出日志并与一堆外部系统(Slack、Hipchat 等)集成)通过插件接收故障通知。

上次我设置了这个,它帮了大忙。我们立即知道了任何地方是否有问题,并且能够从多个不同的系统集中控制和跟踪 cron。

答案4

在现代 Ubuntu 系统上使用

journalctl -u cron.service -x

要在不发送电子邮件的情况下通知错误,请尝试以下操作:

0 1,13 * * * /usr/bin/php /var/www/html/script.php > /tmp/script.log 2>&1 ; [ $? -ne 0 ] && notify-send -u critical -t 3000 "Cron script.php Failed in Execution" "Type journalctl -u cron.service -x to see more details"

相关内容