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

#1 楼

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

crond在发送输出邮件时遇到问题,或者邮件丢失。
程序没有产生任何输出(包括错误消息)

情况1.不太可能,但是在cron日志中应该已经写了一些东西。 Cron拥有自己的保留syslog工具,因此您应该查看/etc/syslog.conf(或您的发行版中的等效文件)以查看将cron的消息发送到哪里。受欢迎的目的地包括/var/log/cron/var/log/messages/var/log/syslog。在情况2中,您应该检查邮件守护程序日志:来自Cron守护程序的消息通常显示为来自root@yourhost。您可以在crontab文件中使用MAILTO=...行,以使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是否确实在运行某些东西。

评论


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

–内森·朗(Nathan Long)
13年8月13日在15:59

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

–内森(Nathan)
2013年12月22日下午2:20

根据邮件传输代理的不同,您可能还会在根目录或相应用户主目录中的dead.letter文件中找到未送达的邮件。

–达里奥·塞德尔(Dario Seidl)
18年7月18日在13:13



#2 楼

您始终可以将作业输出明确地发送到日志文件:

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


请记住,这将取代之前提到的邮件行为,因为赢得了crond iself没有收到工作的任何输出。如果要保持这种行为,应查看tee(1)。

评论


为什么不使用>>而不是>,这样就不会每次都覆盖日志文件?

–克里斯
18-10-23在1:41

当然!任何种类的I / O重定向都可以,甚至|如果您愿意,可以使用/ usr / bin / logger,这是Stefan明智建议的。选择你的毒药:tldp.org/LDP/abs/html/io-redirection.html

–代码头
19年4月18日在17:46



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

–会计م
19年7月1日在4:41



最后的&1是什么意思?

–Čamo
20年6月15日在15:38

如在此SO答案中提到的@Čamo,如果指令的含义是2> 1,则将STDERR重定向到名为1的文件名。由于在1之前有一个&,因此将1视为文件描述符。

–阿里
20年6月24日在7:17

#3 楼

如果您没有看到邮件,则可能是向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等),还减少了向根目录发送电子邮件的垃圾邮件。输出。

评论


这真的很好!我正在Lovia使用我们的Mautic配置。谢谢斯蒂芬!

–亨拉·爱侣湾(Hendy Irawan)
20-10-13在14:44

十年后,我仍然这样做!

– Stefan Lasiewski
20-10-14在21:24

#4 楼

当作业无法运行或作业返回非零退出代码时,您应该从crond收到电子邮件。尝试在命令提示符下键入:

$ mailx




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

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

#5 楼

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

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

#6 楼

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

评论


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

– Dan Dascalescu
19年5月17日下午4:50

#7 楼

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

#8 楼

另一个有用的技巧是查看实际执行了哪些脚本。

这是通过run-parts -v --test /etc/cron.hourly/完成的。

> /etc/cron.hourly//logrotate


如果脚本未显示,将不会执行。

此btw仅适用于安装在/etc/cron.hourly目录中的脚本。它不会显示您在crontab中设置的
项目。

#9 楼

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

在我的/root/文件夹中,我有crons.cron,可以通过运行crontab /root/crons.cron将其设置为crontab。 dead.letter也会在/root/中创建。

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

#10 楼

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

评论


您是对的,但我不确定这是否能真正回答问题。

–roaima
18年11月6日在11:23

#11 楼

我知道它看起来似乎很明显,但是值得验证一下,实际上可以在没有Cron的情况下手动运行脚本。我的问题是我尝试运行的脚本需要身份验证。手动运行时很明显,但是没有收到任何电子邮件或其他提示。