cron错误记录在哪里?


170

如果我cron不正确地设置作业,它们似乎会静默失败。我应该在哪里寻找错误日志以了解问题所在?

Answers:


106

正如其他人指出的那样,cron它将通过电子邮件将其运行的任何程序的输出通过电子邮件发送给您(如果有任何输出)。因此,如果没有任何输出,则基本上有三种可能性:

  1. crond 甚至无法启动外壳来运行程序或发送电子邮件
  2. crond 在发送输出邮件时遇到麻烦,或者邮件丢失了。
  3. 该程序未产生任何输出(包括错误消息)

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

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

MAILTO=my.offsite.email@example.org
00 15 * * *  echo "Just testing if crond sends email"

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

00 15 * * * /a/command; touch /tmp/a_command_has_run

因此,您可以crond通过查看的mtime 来检查是否确实在运行某些程序/tmp/a_command_has_run


3
这些“电子邮件”也放入文件中吗?我正在使用共享的虚拟主机,不认为他们会在哪里给我发送电子邮件。
内森·朗

3
我很高兴在情况3中检查命令是否正在运行的建议。就我而言,cron不能执行我的工作,因为我最近更改了服务器的时区,并且需要重新启动cron服务器,以便它将在适当的时区中评估cron时间。
弥敦道

1
根据您的邮件传输代理,您可能还会dead.letter在根目录或相应用户主目录中称为的文件中找到未送达的邮件。
达里奥·塞德尔

43

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

0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1

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


9
为什么不使用>>代替而不是>,这样您就不会每次都覆盖日志文件?
克里斯(Chris)

当然!| /usr/bin/logger正如Stefan巧妙建议的那样,即使您愿意,任何类型的I / O重定向都可以。选择你的毒药:tldp.org/LDP/abs/html/io-redirection.html
代码头

cron myjob.log按预期创建了大小为0的该日志文件,但它已记录到另一个文件,在哪里可以更改此设置?
会计师م

42

如果您没有看到邮件,则可能是向root @ yourcompany发送了一些错误消息,这些错误对于使用该帐户进行监视的人员可能非常烦人。尝试将输出发送到Syslog:

*/5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag

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

这对于只有1-2行长的错误消息非常有用,例如“ yourcronjob:找不到命令”。它还利用您现有的syslog基础结构(Logrotation,中央syslogging,Splunk等)。它还减少了从根到站的电子邮件垃圾邮件。

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


8

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

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


7

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

$ mailx

在命令提示符下。

mailx(1)是大多数Unixlike系统上的基本邮件阅读程序。从现代标准来看,它非常原始,但是您可以指望它始终可用。可能还有其他更好的邮件代理,但是它们太多了,您甚至都不知道您恰巧在使用的随机计算机上安装了哪个代理。

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


5

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


/var/log/messages我的Ubuntu服务器(4.4.0-128-generic #154-Ubuntu SMP)上没有。知道为什么吗?我已经在rootcrontab的几个月中定义了一些cron作业(例如apt autoremove),但似乎没有执行过。
Dan Dascalescu

2

几年前,我偶然遇到了同样的问题,而最近,里卡多(Ricardo)遇到了上述问题的解决方案。正如您提到的那样,很难检测到缺少电子邮件,并且您当然也不想向root @ yourcompany电子邮件发送垃圾邮件。如果有兴趣,请查看deadmanssnitch.com。。该工具似乎可以解决上述情况。使用起来似乎很简单-只需添加该工具为您的cronjob提供的代码。如果您的作业无法在指定的内部运行,则会收到警报。如果您的工作再次开始运行,您还将收到警报。


1

我使用vixie-cron,所以我不知道这是否适用于所有内容。但是我有一个dead.letter包含所有作业输出的文件。

在我的/root/文件夹中crons.cron,通过运行将其设置为crontab crontab /root/crons.crondead.letter也将在其中创建/root/

编辑 我只是Google发送的dead.letter,这是一封无法投递的邮件。显然,它与cron无关。如果您没有正确设置邮件(例如我),则将拥有该文件。


0

对于新手来说,调试可能会很痛苦。确保不要互换分钟和小时值。首先是分钟,然后是小时。当您为每个值提供的值小于12时,它将接受它们,但可能无法按预期或完全无法工作。


2
您是对的,但我不确定这是否能真正回答问题。
roaima
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.