由于某种原因,我的 crontab 没有运行每小时/每周/等脚本。似乎是 run-parts 不起作用,我也无法让它在本地机器上运行。我使用它的方式有错误吗?
fabe@fabetop ~ $ cat /home/fabe/tmp/test.sh
#!/bin/sh
touch /home/fabe/tmp/test_it
fabe@fabetop ~ $ ls -la /home/fabe/tmp
total 32
drwx------ 2 fabe fabe 4096 Feb 20 15:00 .
drwx------ 60 fabe fabe 16384 Feb 20 15:00 ..
-rwxr-xr-x 1 fabe fabe 39 Feb 20 15:00 test.sh
fabe@fabetop ~ $ run-parts --report /home/fabe/tmp
fabe@fabetop ~ $ ls -la /home/fabe/tmp
total 32
drwx------ 2 fabe fabe 4096 Feb 20 15:00 .
drwx------ 60 fabe fabe 16384 Feb 20 15:00 ..
-rwxr-xr-x 1 fabe fabe 39 Feb 20 15:00 test.sh
答案1
问题在于你的脚本的名称。来自man run-parts
:
如果没有给出 --lsbsysinit 选项或 --regex 选项,则名称必须完全由 ASCII 大写和小写字母、ASCII 数字、ASCII 下划线和 ASCII 减号连字符组成。
换句话说,没有扩展名。奇怪的是,即使有这个--lsbsysinit
选项,你也不能指定这样的文件,foo.sh
因为它与所涵盖的任何命名空间都不匹配:
如果给出了 --lsbsysinit 选项,那么名称不能以 .dpkg-old 或 .dpkg-dist 或 .dpkg-new 或 .dpkg-tmp 结尾,并且必须属于下列一个或多个命名空间:LANANA 分配的命名空间 (^[a-z0-9]+$);LSB 分层和保留命名空间 (^_?([a-z0-9_.]+-)+[a-z0-9]+$);以及 Debian cron 脚本命名空间 (^[a-zA-Z0-9_-]+$)。
因此,whilefoo.sh
会失败,foo.s-h
或者foo.-sh
会起作用。我不知道他们为什么这样做,但大概他们遵循了某种标准。
无论如何,您有两个选择,要么重命名脚本使其不带扩展名(扩展名在 *nix 中是可选的),要么run-parts
完全跳过使用。在您的crontab
脚本中改用以下方法:
find /home/fabe/tmp/ -prune -type f -executable -exec {} \;
上述命令将查找目标目录中的所有可执行文件并运行它们。我认为这-executable
是一个 GNU 扩展,但您已将其标记为 Linux,因此我假设您有 GNU find。
答案2
文件夹中的每个脚本/etc/cron.hourly
都会按小时运行。
但是你的文件需要:
- 可执行文件,
- 匹配 Debian cron 脚本命名空间
(^[a-zA-Z0-9_-]+$)
。
因此,例如如果您的脚本带有扩展名(.sh
在这种情况下),它将不起作用。
要打印将要运行的脚本的名称,请尝试:
sudo run-parts --report --test /etc/cron.hourly