为什么我的 crontab 没有触发?

rip*_*234 30 cron

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

* * * * * echo hi >> /home/myusername/test
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑 2 - 嗯,我的测试文件似乎有 214 行,这意味着在过去的 214 分钟内,它每分钟写入一次。我不确定是什么问题,但它显然已经消失了。

gel*_*aen 29

在 cronjob 之后添加了一个空行吗?

  • 不是空行,而是最后一行末尾的换行符。文本文件应该由一系列行组成,每行都以换行符结尾,因此任何非空文本文件都以换行符结尾。某些实用程序在文件中的最后一个换行符之后不处理任何内容。 (5认同)

Gil*_*il' 24

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


小智 10

我遇到了同样的问题 - 在我最后添加了一个新条目后,一个正常工作的 crontab 突然停止了。结果是我忘记在最后一行之后放一个换行符。

我通过发出命令发现

cat /var/log/syslog | grep crontab
Run Code Online (Sandbox Code Playgroud)

并且输出显示了问题:

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)
Run Code Online (Sandbox Code Playgroud)

添加换行符并保存解决了问题。


Ste*_*ski 5

听起来这是固定的。下次,也尝试记录 STDERR。以下只会记录到 STDOUT,而不是 STDERR:

* * * * * echo hi >> /home/myusername/test
Run Code Online (Sandbox Code Playgroud)

尝试确保 STDERR 也有明确的子句。否则,根据 Cron 的配置方式,STDERR 可能会通过电子邮件发送给用户(假设电子邮件正在工作),或者可能根本不去任何地方。

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr
Run Code Online (Sandbox Code Playgroud)

我的偏好是将 cronjob 输出发送到 syslog。这样我就可以利用任何现有的系统日志基础设施(集中式系统日志、Splunk、已经支持的日志轮换,很容易比较 /var/log/messages 和 /var/log/cronjob 等中的消息),而我不是用不必要的电子邮件向系统管理员(我)发送垃圾邮件。

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob
Run Code Online (Sandbox Code Playgroud)