为什么我的cron.d每分钟工作没有运行?


33

我抛出了一堆飞镖,试图让我的Python脚本每分钟执行一次。因此,我想将其简化为每分钟执行一次“可能会起作用的最简单的事情”(我正在运行debian / testing)。

我在中创建了一个单行文件/etc/cron.d/perminute

* * * * * /bin/touch /home/me/ding_dong

它由root和可执行文件拥有(不确定这两个是否重要)。然后我做了:

sudo service cron reload

然后坐在ls -ltr我的主目录(/home/me)中一次又一次开始运行。但是我的ding_dong文件从不显示。我知道是否执行sudo /bin/touch /home/me/ding_dong,它会立即显示。

显然这里缺少一些愚蠢的东西。


3
通常不需要重新加载cron守护程序服务以在cron.d中应用更改,因为无论如何它都会每分钟重新扫描目录以查找新文件和更新文件。
Josip Rodin 2015年

Answers:


45

当添加cron配置/etc/cron.d/或者/etc/crontab你必须添加在上下文中的命令应该运行的用户名,在你的榜样

* * * * * root /bin/touch /home/me/ding_dong

我的提示是:您不必ls -ltr一次又一次地开始运行,只需使用watch -n 5 "ls -ltr"它,它将每5秒运行一次命令(或通过将5替换为所需的值来运行其他任何值)。


9
这使我朝着正确的方向前进。这是一个令人头疼的时刻。我修复了它,但仍然没有用。在man cron稍微慢一点阅读并特别注意了这些DEBIAN specific部分之后,我注意到这些文件一定不能分组或其他可写的。我曾一度使我沮丧。
特拉维斯·格里格斯

您是否也可以仅将脚本所有者更改为root?
Geremia

这条线对我有所帮助。从man cron:另外,在Debian中,cron读取/etc/cron.d目录中的文件。cron将/etc/cron.d中的文件与/ etc / crontab文件一样对待(它们遵循该文件的特殊格式,即,它们包括user字段)。但是,它们独立于/ etc / crontab:例如,它们不从中继承环境变量设置。此更改特定于Debian,请参见下面的DEBIAN SPECIFIC下的注释。
哈珀维尔

man 8 cron(在Debian上)还说/etc/cron.d/中的文件只能包含字母数字字符“-”和“ _”。具体来说,没有点。
mpartel '17

3

要创建新cron作业,您应该crontab -e以要运行作业的用户身份运行。然后在出现的编辑器窗口中添加相关行:

* * * * * /bin/touch /home/me/ding_dong

您执行此操作的方式需要使用不同的格式,这实际上并不是一个好主意。Crontabs的/etc/cron.d格式略有不同,它们需要运行用户名。例如:

* * * * * USERNAME /bin/touch /home/me/ding_dong

一个好技巧(如@VogonPoetLaureate所建议)是捕获您的cron作业的标准错误,这可以帮助调试它们。例如:

* * * * * /bin/touch /home/me/ding_dong 2>/tmp/error

6
绝对没有理由说cron.d“不是一个好主意”。cron守护程序会将cron.d stderr输出发送到用户名就好了,如果您要将其重定向到另一个电子邮件地址,则可以使用MAILTO变量。
Josip Rodin

@JosipRodin对于不是由root运行并且由您设置的事情不是一个好主意。对于多用户系统上的系统管理员而言,这很有意义,但是在您自己的计算机上,将所有内容都放在自己的crontab中更为简单,因此只有一个地方可以检查并crontab -l列出所有cron作业。
terdon 2015年

假设这实际上只是个人cron作业,OP并没有明确说明-通常,通过cron.d设置了许多特权用户cron作业的应用程序,例如将所有这些程序放在一个位置,尽管事实很不错与世隔绝的服务用户,自动部署更容易等
约瑟普·罗丹

绝对是@JosipRodin。我假设使用个人系统,因为i)企业系统不在此处,并且ii)该问题建议使用非专家用户。
terdon 2015年

好的,我想我不再读这本书了,因为超级用户和serverfault以及unix SE站点之间常见的困惑:)
Josip Rodin

2

这里可能的错误是如何 创建单个行文件。从Ubuntu文档中

... line具有五个时间和日期字段,后跟一个命令,后跟一个换行符

例如,这种创建方式无效:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
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.