如何设置系统来告诉我 cron 作业是不是运行不正常?

Posted

技术标签:

【中文标题】如何设置系统来告诉我 cron 作业是不是运行不正常?【英文标题】:How can I setup a system to tell me if a cron job is NOT running fine?如何设置系统来告诉我 cron 作业是否运行不正常? 【发布时间】:2011-03-27 15:51:13 【问题描述】:

这更像是一个“通用架构”问题。如果您有一个定期运行的 cron 作业(甚至是 Windows 计划任务),让它向您发送一封电子邮件/短信告诉您一切正常,但 如何 当一切顺利时我如何得到通知不行吗?基本上,如果作业没有在预定的时间运行,或者 Windows / linux 有自己的一组挂起阻止任务运行......?

只是寻求以前遇到过这种情况的人的想法并提出有趣的解决方案......

【问题讨论】:

制作一个检查 cron 作业的 cron 作业:D 尽管很幽默,大卫,这不是个坏建议。单个 cron 作业可能因多种原因而失败,其中只有一个原因是整个 cron 子系统出现故障。 谢谢亚历克斯。 David / paxdiablo - 依赖“外部”/第 3 方 cron 服务是一个不错的选择……作为“cron-checker”? 我不会打扰。老实说,在我 30 年的职业生涯中,我认为 cron 本身失败的次数不多。我不确定我会在不太可能的事情上花费很多精力。但是,如果您真的想放心,请使用单独的 cron job 以确保其他作业正在运行,并且还让作业向另一台机器发送某种消息,也许使用它的 cron ( meta-cron) 以检查消息是否尚未到达。请记住,这会给您在其他情况下的误报(例如网络关闭)。你想要一个 meta-meta-cron 来关注它吗? :-) 【参考方案1】:

我过去做过的一种方法是简单地放在每个脚本的顶部(例如,checkUsers.sh):

touch /tmp/lastrun/checkUsers.sh

然后有另一个定期运行的作业,它使用find 来定位tmp/lastrun 中超过一天的所有“标记”文件。

您可以调整时间安排,使用 /tmp/lastrun/hour/tmp/lastrun/day/ 来分隔具有不同时间表的作业。

请注意,这不会捕获从未运行的脚本,因为它们永远不会为find-ing 创建初始文件。为了缓解这种情况,您可以:

在创建 cron 作业时手动创建该文件(不会处理有人无意中删除标记文件的情况);或 在某处维护所需标记文件的列表,以便您可以检测到它们何时丢失以及何时过时。

而且,如果您的 cron 作业不是脚本,请将 touch 直接放入 crontab

0 4 * * * ( touch /tmp/lastrun/daily/checkUsers ; /usr/bin/checkUsers )

验证一个简单的find 脚本比验证您的每一个cron 作业要容易得多。

【讨论】:

如果这是一个愚蠢的问题,请原谅我,但是如果一个 cron 失败了,他们是否都可能会失败(如果是硬件或软件错误)? 不一定,问题可能出在 crontab 文件中的行,也可能是脚本的权限。如果 cron 本身有问题,是的。然后你可以把它放在你的登录脚本中(或/etc/profile 或将一个 NFS 文件系统挂载到其他地方接触文件,希望它的 cron 将运行以进行检查)。但是,如果cron 本身不起作用,则几乎没有其他选项可以自动进行检查。在某些时候,您必须相信 一个 层的软件会正常运行 :-) 我并没有说它是万无一失的——它所做的只是让检测故障变得更容易。 有趣的方法...不是完全我正在寻找的...(更完整的解决方案,也可能使用外部系统)

以上是关于如何设置系统来告诉我 cron 作业是不是运行不正常?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Quartz cron 作业是不是正在运行?

如何确保 cron 作业能够运行?

如何以用户而不是 root 用户身份运行 cron 作业 [关闭]

如何创建一个 cron 作业来运行 ruby​​ 脚本?

如何让运行 Node.js 脚本的 cron 作业从 .env 文件中读取变量?

如何在 cPanel 上运行 CRON 作业?