如何使用 run-parts 命令?

如何使用 run-parts 命令?

由于某种原因,我的 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

相关内容