cron 错误记录在哪里?

Bri*_*tle 204 cron scheduling logs

如果我cron错误地设置作业,它们似乎会默默地失败。我应该在哪里查找错误日志以了解出了什么问题?

Ric*_*rri 125

正如其他人所指出的,cron将通过电子邮件将其运行的任何程序的输出(如果有任何输出)发送给您。所以,如果你没有得到任何输出,基本上有三种可能:

  1. crond 甚至无法启动 shell 来运行程序或发送电子邮件
  2. crond 邮寄输出时遇到问题,或者邮件丢失。
  3. 程序没有产生任何输出(包括错误信息)

情况 1. 不太可能,但应该在 cron 日志中写入一些内容。Cron 有自己保留的 syslog 工具,因此您应该查看/etc/syslog.conf(或发行版中的等效文件)以查看发送工具消息的cron位置。热门目的地包括/var/log/cron/var/log/messages/var/log/syslog

在第 2 种情况下,您应该检查邮件程序守护程序日志:来自 Cron 守护程序的消息通常显示为 from root@yourhost。您可以使用MAILTO=...crontab 文件中的一行来让 cron 将电子邮件发送到特定地址,这样可以更轻松地 grep 邮件程序守护程序日志。例如:

MAILTO=my.offsite.email@example.org
00 15 * * *  echo "Just testing if crond sends email"
Run Code Online (Sandbox Code Playgroud)

在第 3 种情况下,您可以通过附加另一个您可以轻松检查其效果的命令来测试程序是否实际运行:例如,

00 15 * * * /a/command; touch /tmp/a_command_has_run
Run Code Online (Sandbox Code Playgroud)

因此您可以crond通过查看/tmp/a_command_has_run.

  • 这些“电子邮件”也放在文件中吗?我正在使用共享网络托管,但认为他们不知道在哪里给我发电子邮件。 (5认同)
  • 我很欣赏案例 3 中检查命令是否正在运行的建议。就我而言,cron 没有运行我的工作,因为我最近更改了服务器的时区并需要重新启动 cron 服务器,以便它可以在正确的时区评估 cron 时间。 (3认同)
  • 根据您的邮件传输代理,您还可以在根目录或相应用户主目录中名为“dead.letter”的文件中找到未送达的邮件。 (2认同)

cod*_*ead 69

您始终可以将作业输出显式发送到日志文件:

0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1
Run Code Online (Sandbox Code Playgroud)

请记住,这将取代之前提到的邮件行为,因为 crond 本身不会收到作业的任何输出。如果您想保持这种行为,您应该查看 tee(1)。

  • 为什么不用`>>`代替`>`,这样就不会每次都覆盖日志文件? (23认同)
  • 当然!任何类型的 I/O 重定向都可以,甚至是 `| /usr/bin/logger` 如果你愿意的话,正如 Stefan 巧妙地建议的那样。选择你的毒药:https://www.tldp.org/LDP/abs/html/io-redirection.html (3认同)

Ste*_*ski 49

如果您没有看到邮件,那么您可能是在向 root@yourcompany 发送垃圾邮件,其中包含错误,这对于使用该帐户进行监控的人来说可能非常烦人。尝试将输出发送到 Syslog:

*/5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag
Run Code Online (Sandbox Code Playgroud)

然后,等待 cronjob 运行并在 /var/log/messages(或某些系统上的 /var/log/user.log)中查找错误。

这对于只有 1-2 行长的错误消息非常有用,例如“yourcronjob: command not found”。它还利用您现有的系统日志基础设施(Logrotation、中央系统日志、Splunk 等)。它还可以将垃圾邮件减少到 root。

如果您的 cronjob 生成数百行输出,这可能不是一个好的解决方案。

  • 这真是太好了!我正在使用[我们在 Lovia 的 Mautic 配置](https://about.lovia.life/docs/infrastruct/mautic-engineering/installing-mautic-in-ubuntu-vm/)。谢谢斯特凡! (2认同)
  • 10年后我仍然这样做! (2认同)
  • @Wirone:该文件确实包含 CRON 日志,但仅包含时间和调用行;无输出。我有一个包含 2 个命令的 crontab 条目,可以从回显的命令行完美运行,但是当 cron 执行它时,第二个命令不会运行(第一个命令会运行)。调试这一点非常令人沮丧。 (2认同)

War*_*ung 11

crond当作业无法运行或作业返回非零退出代码时,您应该收到电子邮件。尝试输入:

$ mailx
Run Code Online (Sandbox Code Playgroud)

在命令提示符下。

mailx(1)是大多数类 Unix 系统上的基本邮件阅读程序。按照现代标准,它非常原始,但您几乎可以指望它始终可用。其他更好的邮件代理可能是可用的,但是它们太多了,您永远不知道在您碰巧使用的随机机器上安装了哪个。

请注意,除非您已将系统配置为 Internet 电子邮件服务器,否则此邮件子系统仅在机器内使用。您可以在机器上向其他用户发送和接收电子邮件,但您可能无法向世界发送电子邮件,并且来自外部世界的电子邮件肯定无法到达您的机器。


mig*_*aza 8

默认的 cron 配置将向您发送一封包含程序输出的邮件。如果失败,您可以尝试将失败的程序包装在一个 shell 脚本中,以确保程序不会失败,并且您可以进一步记录输出。

这是某些 cron 实现的可配置设置。


Hem*_*ant 5

Cron 将基本信息记录到/var/log/messages,但将任何程序输出邮寄给调用用户。

  • 我的 Ubuntu 服务器上没有 `/var/log/messages`(`4.4.0-128-generic #154-Ubuntu SMP`)。知道为什么吗?几个月来,我在 `root` 的 crontab 中定义了一些 cron 作业(例如 `apt autoremove`),但似乎没有一个被执行。 (2认同)