my_cron
文件在/etc/cron.d/
中直接创建时有效:
sudo nano /etc/cron.d/my_cron
# Add content:
* * * * * username /path/to/python /path/to/file 2>/path/to/log
但是它在我将其复制/移动到目录中时不起作用:
sudo cp ./my_cron /etc/cron.d/my_cron
ls -l /etc/cron.d
两次都输出相同的权限:-rw-r--r--
。这些文件归root
所有。
目前我唯一能想到的原因是我必须在复制后刷新/激活某些内容,这在创建时会自动发生。
在Ubuntu和Raspbian上进行了测试。
有什么主意吗?谢谢!
答案 0 :(得分:1)
较旧的cron
守护程序仅在发现目录或/etc/cron.d
的上次修改时间戳自上次更改以来才用于检查/etc/crontab
的更新内容cron
扫描了它。最近的cron
守护程序还检查了/etc/cron.d
中各个文件的时间戳,但也许您在这里处理的是旧文件。
如果您有旧的cron
,则如果将全新文件复制到/etc/cron.d
中,则目录的时间戳应该更改,cron
应该会注意到新文件。
但是,如果您的cp
仅覆盖现有文件,则不会更改目录时间戳,并且cron
也不会获取新文件的内容。
在/etc/cron.d
中就地编辑文件不一定会更新目录时间戳,但是某些编辑器(肯定是vi
,除非您另行配置)会创建临时工作文件,也许还会待编辑文件所在目录中的备份文件。创建和删除其他文件将导致目录时间戳记更新,并使cron
使编辑后的文件生效。这可以解释为什么编辑对您的行为不同于cp
。
要强制更新时间戳,您可以执行sudo touch /etc/crontab
之类的操作,也可以在完成/etc/cron.d
之后在cp
中创建并立即删除暂存文件(或目录)。或rm
在那里的文件。显然touch
更容易。如果您想执行create + delete路线,那么mktemp
将是一个很好的工具,以避免破坏他人的合法文件。
如果您真的很偏执,那么您至少要等一秒钟,然后再进行文件更改,然后执行您选择执行的任何操作以强制更新时间戳。那应该避免cron
重新扫描,文件更新以及touch
或临时创建+删除都可能在时间戳的粒度内发生的情况。
如果您想查看自己的cron
在做什么,可以sudo strace -p <pid-of-cron>
。通常,它每次一次睡眠一分钟,但是每次唤醒时,您会stat
看到它一些文件和目录(包括/etc/crontab
和/etc/cron.d
)。当然,如果它决定需要执行一项工作,您也会看到该活动。