it-swarm.cn

为什么我的crontab没有触发?

我用了 crontab -e将以下行添加到我的crontab中:

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

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

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

编辑-问Ubuntu有 关于crontab的一个不错的问题 ,不幸的是,这仍然没有帮助。

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

29
ripper234

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

23

您是否添加了 在cronjob之后为空行

28
gelraen

我遇到了同样的问题-在最后添加新条目后,工作的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)

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

10
uniomni

听起来像是固定的。下次,也尝试记录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
5
Stefan Lasiewski

对我来说,问题是该脚本不可执行。我有crontab -e这样的设置

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

而且myscript文件不可执行,所以我运行了

chmod +x my-script.sh

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

2
santiago arizti

我想这可能是因为/ home /目录已加密,并且用户注销后cron无法在该目录中执行任何操作。

参见: https://stackoverflow.com/a/40354269/1279002

1
theINtoy

当我将myusernae更改为phunehehe时,您的cron行在我的计算机上可以正常工作。有几种方法可以找出系统出了什么问题。

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

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

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

killall fcron
fcron --foreground --debug
1
phunehehe

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

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

MAILTO="[email protected]"
* * * * * echo hi >> /home/myusernae/test

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

1
jsbillings