直接复制到 /var/spool/cron/crontabs 的 Cron 文件不会执行

直接复制到 /var/spool/cron/crontabs 的 Cron 文件不会执行

直接复制 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。请使用语法。请参阅chownchmodcrontab [ -u user ] fileman 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。

相关内容