如何将文件移动到 Linux 中的 cron.d?

How to move a file to cron.d in Linux?

my_cron-file /etc/cron.d/:

中直接创建 时有效
sudo nano /etc/cron.d/my_cron

# Add content:
* * * * * username /path/to/python /path/to/file 2>/path/to/log

但是当我copy/move它到目录时它不起作用:

sudo cp ./my_cron /etc/cron.d/my_cron

ls -l /etc/cron.d 两次输出相同的权限-rw-r--r--。这些文件归 root 所有。

目前我能想到的唯一原因是我必须在复制后 refresh/activate 一些东西,这在创建时自动发生。

在 Ubuntu 和 Raspbian 上测试。

有什么想法吗?谢谢!

较旧的 cron 守护程序过去常常检查 /etc/cron.d 更新的内容,仅当它们看到该目录或 /etc/crontab 文件的最后修改时间戳已更改时上次 cron 扫描它。最近的 cron 守护程序还会检查 /etc/cron.d 中各个文件的时间戳,但也许您在这里处理的是旧文件。

如果您有一个旧的 cron,那么如果您将一个全新的文件复制到 /etc/cron.d,那么目录的时间戳应该会改变并且 cron 应该会注意到新文件。 但是,如果您的 cp 只是覆盖现有文件,则不会更改目录时间戳并且 cron 不会获取新文件内容。

/etc/cron.d 中就地编辑文件不一定会更新目录时间戳,但某些编辑器(肯定是 vi,除非您另行配置)会创建临时工作文件和可能是正在编辑的文件所在目录中的备份文件。创建和删除那些其他文件将导致更新目录时间戳,这将导致 cron 使编辑的文件生效。这可以解释为什么编辑对您的行为与 cp'ing 不同。

要强制更新时间戳,您可以执行类似 sudo touch /etc/crontab 的操作,或者在 cp 之后创建并立即删除 /etc/cron.d 中的暂存文件(或目录) 'ed 或 rm' 在其中编辑了一个文件。显然 touch 更容易。如果您想使用创建+删除路线,那么 mktemp 将是一个很好的工具,以避免破坏其他人的合法文件。

如果您真的很偏执,那么在进行文件更改和执行您选择执行的任何操作以强制更新时间戳之间至少要等待一秒钟。这应该避免 cron 重新扫描、您的文件更新以及您的 touch 或从头创建+删除都可能在时间戳的粒度内发生的情况。

如果您想查看 cron 实际在做什么,可以 sudo strace -p <pid-of-cron>。大多数情况下,它会一次休眠一分钟,但每次唤醒时您都会看到 stat 一些文件和目录(包括 /etc/crontab/etc/cron.d)。当然,如果它决定需要 运行 一份工作,您也会看到 activity。