直接复制 crontab 文件/var/spool/cron/crontabs/<username>
并不会安排作业执行。
crontab -l
显示文件内容,因此 cron 至少知道它。但它从未被执行。
如果我编辑crontab -e
并做出毫无意义的更改,那么 cron 会以某种方式收到通知,并且一切都正常。
有没有一种编程方式可以达到同样的效果?
参照这个问题,我尝试过这些命令,但没有成功:
sudo service cron reload
sudo service cron restart
sudo /etc/init.d/cron force-reload
PS 是的,我知道将 crontab 直接复制到 /var/spool 不是常用的做法。这是通过 docker 设置新的千篇一律的 aws ec2 ubuntu 实例的更大任务的一部分,我希望它们“预加载”特定的 crontab。
答案1
从您的评论中:
该文件的所有者
root
和组为root
,我将其更改为 组crontab
以匹配该目录中的其他文件。但这没有效果。
在/var/spool/cron/crontabs/
crontab 中,用户ratbert
应该被命名为ratbert
和归 拥有ratbert
。也许您没有更改所有者;或权限;或者…
我在 Kubuntu 21.10 中进行了测试,看来至少有以下因素:
- 名称(应为用户名)
- 拥有用户(应为用户名)
- 拥有组(应该是
crontab
) - 权限(应该是
600
;我没有检查所有的可能性,但肯定有些更严格的权限和一些不太严格的权限是错误的) - 修改时间(?)
如果 cron 加载了具有正确所有权和权限的文件,它将使用它。如果文件被修改,它将被重新加载。您可以破坏某些东西(例如更改拥有者组),而 cron 将继续使用已加载的版本,直到您修改文件或以其他方式导致 cron 尝试重新加载(例如通过重新启动它)。另一方面,如果 cron 尝试加载具有某些错误设置的文件,那么它将停止使用旧版本,不会使用新版本,即使您修复设置后也不会尝试重新加载它。我认为它会在您修改文件后尝试重新加载。
因此,在手动设置后重新启动 cron全部把这些事情都做好是个好主意。这样它就会注意到目标状态下的文件。
但事情必须正确设置。我强烈怀疑你创建了一个拥有错误所有权和/或权限的文件。我注意到crontab -l
它并不挑剔,可以打印出无法正常工作的文件。crontab -e
保存更改并修复事情。这就是为什么crontab -l
没有失败并crontab -e
确实帮助你。如果你比较修复ls -l /var/spool/cron/crontabs/ratbert
之前和之后的crontab -e
事情,那么你可能会发现你特定情况下的缺陷是什么。
我认为我们可以手动设置,并且 cron 会工作,只要我们设置全部正确设置。但手动执行此操作可能不是一个好主意。是的,如果您要为另一台机器准备文件系统(磁盘映像),那么您可能需要这样做。另一台机器稍后将启动其 cron,如果您正确设置了所有内容,那么它应该可以工作。
通常,在目标操作系统中工作时,不要为此使用或cp
。请使用语法。请参阅chown
chmod
crontab [ -u user ] file
man 1 crontab
:
crontab [ -u user ] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
[…]
-
如果给出了伪文件名,则此命令的第一个形式用于从某个命名文件或标准输入安装新的 crontab 。
这POSIX 规范没有提到-u
,选项不可移植;但crontab file
形式是可移植的,这是将文件安装为 crontab 条目的正确方法。在 Ubuntu 中,您可以使用-u
。示例命令如下:
crontab -u ratbert /path/to/predefined/file
该工具将设置一切对您来说,您甚至不需要重新启动 cron。