it-swarm.cn

cron错误记录在哪里?

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

182
Brian Lyttle

正如其他人指出的那样,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守护程序的消息通常以[email protected]的形式出现。您可以在crontab文件中使用MAILTO=...行,以使cron将电子邮件发送到特定地址,这将使grep邮件守护程序日志的记录更加容易。例如:

[email protected]
00 15 * * *  echo "Just testing if crond sends email"

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

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

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

116
Riccardo Murri

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

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

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

54
codehead

如果您没有看到邮件,则可能是向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生成数百行输出,则可能不是一个好的解决方案。

44
Stefan Lasiewski

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

_$ mailx
_

在命令提示符下。

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

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

8
Warren Young

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

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

8
miguel.de.icaza

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

5
Hemant

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

2
ss_jt

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

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

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

1
jonescb

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

这是通过run-parts -v --test /etc/cron.hourly/

> /etc/cron.hourly//logrotate

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

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

1
RickyA

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

0
Michael Woyo