接收失败的定时任务通知

我担心在原始版Ubuntu桌面12.04.1(Precise)上,cron作业可能会在不确定的时间内静默失败,而没有人会注意到。我希望每当系统cron作业打印一些输出或仅失败时,都能收到通知。
我知道可以安装邮件服务器(例如postfix),将其配置为本地传递,设置别名以便root的邮件传递到我的普通用户帐户,并配置邮件客户端来检查我的本地邮箱。
在Ubuntu中是否有任何轻量级的替代解决方案?
9个回答

你可以将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

不知道你会在那里找到什么,但值得一试。回来告诉我结果如何。

谢谢。我对现有和未来的系统定时任务感到担忧。所以我宁愿不修改它们。这样会阻碍升级,并且无法覆盖作为软件包更新的一部分收到的任何新的定时任务。因此,我正在寻找一种能够同时适用于所有系统定时任务的解决方案。 - Till Ulen
如果有一个解决方案存在于通常的邮件发送器之外,能够满足这么多限制条件,我会感到惊讶。 - con-f-use

每当系统 cron 作业打印某些输出或失败时,我想收到通知。

我建议使用某种 cron 监控工具。有几款工具可供选择,但我目前使用的是 Dead Man's Snitch (https://deadmanssnitch.com),我很喜欢它。当 cron 作业未进行检查时,它会向您发送警报。就像您正在做的那样,在作业之后,只需使用 curl 命令访问您独特的 snitch URL。还有其他一些类似 probyapp 的工具,但它们不是免费的...祝好运。


希望你不介意我说,我觉得你应该看一下https://cronitor.io。在尝试使用DMS后,我意识到它有一些真正的缺陷,所以我建立了Cronitor。基本上,如果一个月的定时任务未能运行,可能需要长达29天才能收到通知。我们是用Python在Ubuntu上构建的Cronitor,你应该来看看。 - Shane H
3我又建了一个:healthchecks.io,代码在github上。 - Pēteris Caune
@Peteris 做得太棒了 - aklmie

Jenkins是一种相当有用的工具,适用于这类事情。我知道人们倾向于将其视为CI工具,但它实际上只是一个作业执行工具。它将捕获作业的输出、运行时间和退出代码状态,用于确定作业是否失败。
您可以设置ssh-agent,让Jenkins连接到远程机器,像cron一样安排作业运行,并根据运行时间(而不是“凌晨3点”)自动分配空间,链式依赖,按作业基础旋转输出日志,并通过插件与一些外部系统集成(如Slack、Hipchat等),以便在出现故障时收到通知。
上次我配置这个工具时,它帮了大忙。我们可以立即得知任何地方是否存在问题,并能够集中控制和跟踪来自多个不同系统的cron任务。

在现代的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"

无法在没有X11 $DISPLAY的情况下自动启动D-Bus,当我想要显示通知时。 - Gelldur

cronwrap 1.4

网址: https://pypi.org/project/cronwrap/

一个用于包装cron任务的工具,可以提供更好的错误报告和命令超时功能。

安装方法如下:

pip install cronwrap

我已经做了类似以下的事情,但我的用例是为了在cron中设置脚本或可执行文件集合。
0 1,13 * * * /usr/bin/php /var/www/html/script.php > /tmp/script.log 2>&1 ; [ $? -ne 0 ] && mail -s "Cron Failure Report `date` " my.email@mail.com <<< "Cron script.php Failed in Execution"

希望能有所帮助!
对于系统范围的应用,DMS是一个选择。如果你找到了其他方法来完成,请及时更新。

每当您预定的cron作业运行失败时,可以通过以下方式收到电子邮件通知:
1. 将所有标准输出重定向到`/dev/null`或某个文件中。 2. 使用`MAILTO`环境变量,并将要接收电子邮件通知的所有电子邮件地址列出(以逗号分隔)。
为了避免在每个任务中使用相同的MAILTO值,您可以直接在crontab中编写,例如:
MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null

将“MAILTO="foo@bar.com"”添加到crontab的顶部将会导致cron作业的任何输出被发送到电子邮件。因此,我们将STDOUT重定向到null,并且如果有任何STDERR消息存在,则会通过电子邮件发送给您。

SRC


试试这个(示例显示;讨论在这里:https://unix.stackexchange.com/questions/265026/rsyncs-read-only-file-system-30-error/613594#613594):
## all as one line (broken here for readability):

0  5  *  *  *  <your_username>  nice -n 19
  rsync -aq --delete /mnt/Music/ /mnt/Music_Backups ; EXIT_STATUS=$?;
  if [ $EXIT_STATUS -ne 0 ]; then
  notify-send -i warning -t 0 "/etc/crontab for rsync'd Music Backups failed"
  --icon=dialog-information ;
  mutt -s "/etc/crontab for rsync'd Music Backups failed" <your_email_address>; fi

你试过写脚本吗?我相信肯定有简单的方法,就像这样:
如果 cron.output = fail 那就发送通知 "sorry bro"

你有没有办法将这样的脚本与cron集成?逐个修改所有系统cron作业并不是一个好主意。我正在寻找一种能够同时应用于所有系统cron作业的解决方案。 - Till Ulen
给你点了个踩。很抱歉,兄弟。 - Akhil

  • 相关问题