我在服务器上有一系列 cron 作业。我知道我可以将它们的 stdout/stderr 输出重定向到一个文件。如果我将多个 cron 作业输出重定向到同一个文件,即使某些作业可能同时运行,这是否可行?
答案1
不,它们可能会互相覆盖。
作为一种简单的方法添加
在 crontab 的顶部,然后 cron 会将任何输出通过电子邮件发送给您。
更复杂的方法可能涉及设置cronolog
对 FIFO 的监听,然后将这些脚本的输出发送到 fifo。这需要一些小心和处理,如果 FIFO 出现故障,那么您的 cron 作业将阻止写入它。
说实话,我更喜欢 cron 作业,除非出现问题,否则不会输出任何内容,在这种情况下MAILTO
会通知我。
答案2
更简单的方法是将所有输出导入“logger”工具并记录到系统日志,即
* * * * * cronjob1.sh 2>&1 | logger -t cronjob1
* * * * * cronjob2.sh 2>&1 | logger -t cronjob2
然后查看 /var/log/messages
缺点是这是机器范围的,您必须以 root 身份才能查看日志,尽管可以设置具有用户可访问权限的单独 syslog 文件。
答案3
在阅读了许多类似这样的帖子后,我发现 cron 没有统一的日志记录。对于我们大多数人来说,企业工作负载计划不是一种选择,最常见的建议是使用记录器和/或通过电子邮件发送脚本输出或将输出附加到文件。有用的日志记录和警报是这些技术都无法实现的。因此,我编写了一个 Perl 脚本,并在 GitHub 上分享,解决了以下问题:
电子邮件记录/警报:有问题,因为如果你的脚本很吵,它会向你发送垃圾邮件,你将不再关注这些电子邮件
记录器:记录到系统日志 - 你如何知道你的脚本是成功还是失败?没有错误就代表成功吗?
记录到文件 - 与记录器相同,但意味着您必须设置自己的日志轮换
当发生特定故障时发出警报(非零退出代码、由于捕获信号而退出、在 STDERR/STDOUT 上输出)
看看吧。它有效而且免费:https://github.com/ttubiak/utils/blob/master/bs
它被称为“BS”(保姆),欢迎您使用/采用它。总之,它是一个“父”脚本,将您的程序作为子进程运行。您告诉它要运行什么,如果您的脚本遇到问题,它将为您运行它,并进行有意义的日志记录和标志文件生成。它的工作原理是将自身附加到程序的 STDOUT 和 STDERR 并等待程序完成运行。当 bs 启动您的程序时,它将使用 syslog 来表示,当您的程序/脚本写入 STDOUT/ERR 时,它会将其记录到 syslog 中,如果您选择这样做,它会写入您可以监视的文件。如果您的程序死机,它自然会通过 syslog 记录此信息并创建一个您可以监视的标志文件。此外,它还会通过 syslog 记录一行统计信息,以便您知道代码运行需要多长时间。它可以与 Nagios 检查结合使用更高级的功能,我打算及时发布。