为什么我的crontab没有触发?


29

我曾经crontab -e在crontab中添加以下行:

* * * * * echo hi >> /home/myusername/test

但是,我看不到测试文件已写入。这是权限问题,还是crontab无法正常工作?

我看到cron进程正在运行。我该如何调试?

编辑 -询问Ubuntu 对于crontab一个很好的问题,不幸的是,这仍然没有帮助。

编辑2-嗯,看来我的测试文件有214行,这意味着在最后214分钟内,它已写入每分钟。我不确定是什么问题,但是显然已经解决了。

Answers:


23

有一些实现cron(不是全部,而且我不记得是哪个临时实现,但我在Linux下遇到过),这些实现每分钟都在每分钟检查更新的crontab文件,直到下一分钟才考虑新条目。因此,crontab最多可能需要两分钟才能启动。这可能是您观察到的。


1
我猜想是Solaris,也许是早期的Solaris。当我从crontab条目测试脚本时,我习惯使cron条目在将来运行3-5分钟,因为以前我一直都被这种行为所迷惑。
Bruce Ediger

fcron也这样做。
phunehehe 2011年

如果“检查”例程花费了几分钟以上怎么办?在这个漫长的“检查”期间,将触发一些cronjob,但这些触发并未触发。
ospider

@ospider检查仅需一秒钟的时间。
吉尔斯(Gillles)“所以-别再邪恶了”

28

在cronjob之后是否添加了空行


我的cronjob之后有一个空行。
ripper234 2011年

4
不是空行,而是最后一行末尾的换行符。文本文件应该由一系列的行组成,每行以换行符结尾,因此任何非空的文本文件都以换行符结尾。在文件中的最后一个换行符之后,某些实用程序不处理任何内容。
吉尔斯(Gillles)“所以-别再邪恶了”

1
这是术语问题,“换行符”是指“在此字符开始新行之后”。因此,最后一个换行符和EOF之间的0个字节也可以视为空行(“包含0个字符的行”)
gelraen 2011年

10

我遇到了同样的问题-在最后添加新条目后,工作的crontab突然停止了。原来,我忘了在最后一行之后加上换行符。

我通过发出命令发现了

cat /var/log/syslog | grep crontab

并且输出显示了问题:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

添加换行符并保存可以解决此问题。


5

听起来像是固定的。下次,也尝试记录STDERR。以下内容将仅登录到STDOUT,而不是STDERR:

* * * * * echo hi >> /home/myusername/test

尝试确保对STDERR也有一个明确的子句。否则,取决于Cron的配置方式,STDERR可能会通过电子邮件发送给用户(假设电子邮件正在运行),或者根本不发送。

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

我的偏好是将cronjob输出发送到syslog。这样,我就可以利用任何现有的syslog基础结构(集中式syslog,Splunk,日志轮换已受支持,可以轻松比较/ var / log / messages和/ var / log / cronjob等中的消息),但我没有使用不必要的电子邮件向sysadmins(我)发送垃圾邮件。

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob

2

对我来说,问题是该脚本不可执行。我有这样的crontab -e安装程序

* * * * * /bin/my-script.sh

而且文件myscript无法执行,所以我运行了

chmod +x my-script.sh

我立即开始看到预期的输出。


1

你的cron线正常工作在我的电脑上,当我改变myusernaephunehehe。有几种方法可以找出系统出了什么问题。

当出现问题时,Cron通常会将邮件发送给用户。如果看到消息“您有邮件”,请使用邮件客户端检查收件箱。或者,检查您的主目录,其中可能有一个名为的文件dead.letter

您可以检查/var/log/与cron相关的条目。在我的计算机上,日志文件位于/var/log/cron/current(需要root访问)。

如果您具有root用户访问权限,则可以停止cron守护程序并以调试模式启动它。例如,我将使用(更改fcron为守护程序的名称):

killall fcron
fcron --foreground --debug

如何找到守护程序的名称?
ripper234 2011年

@ ripper234使用ps -ef | grep cron,您应该看到cron的一行。检查cron的手册页以查看调试标志。您可能正在使用Vixie Cron,在这种情况下,调试标志为-x。终止cron进程,然后使用附加标志再次启动它。
phunehehe 2011年

还要检查/ var / log / syslog。就我而言,有警告说cron文件是可写组的。
好好对待您的国防部

1

当cron发生故障时,很可能会生成一封电子邮件,发送给该计算机上cron作业的用户ID。如果您的计算机上没有MTA,或者您没有在其他地方阅读或转发该邮件,即使MTA正在工作,您也不会看到该消息。

通过邮件获取crontab错误的一种好方法是使crontab如下所示:

MAILTO="myemail@example.com"
* * * * * echo hi >> /home/myusernae/test

显然,使用您的电子邮件地址而不是myemail@example.com。这告诉cron将错误发送到您的电子邮件地址,而不是本地帐户。特别是,如果您有一个根crontab(或/etc/cron.d中的crontab片段)只想向您发送输出,则这很有用,您可以避免向root的邮箱或root的转发地址发送垃圾邮件。


我不知道系统是否配置了SMTP /外发邮件服务器。奇怪的是事实并非如此。
ripper234 2011年

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.