你如何使用 run-parts 命令?

Fab*_*hau 10 linux cron

出于某种原因,我的 crontab 没有运行每小时/每周/等脚本。似乎运行部件不起作用,我也无法让它在我的本地机器上运行。我使用它的方式有错误吗?

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
Run Code Online (Sandbox Code Playgroud)

ter*_*don 20

问题是脚本的名称。来自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_-]+$)。

所以,虽然foo.sh失败了,foo.s-h还是foo.-sh会奏效。我不知道他们为什么这样做,但大概他们遵循某种标准或其他标准。

无论如何,您有 2 个选项,要么将脚本重命名为没有扩展名(无论如何,扩展名在 *nix 中都是可选的),或者您可以run-parts完全跳过使用。改用它crontab

find /home/fabe/tmp/ -prune -type f -executable -exec {} \;
Run Code Online (Sandbox Code Playgroud)

上面的命令将找到目标目录中的所有可执行文件并运行它们。我认为这-executable是一个 GNU 扩展,但您已将其标记为 Linux,因此我假设您已找到 GNU。

  • 谢谢你!我揪着头发试图理解为什么运行部件的“busybox”版本拒绝找到我的“test.sh”脚本。将其重命名为“测试”,现在可以使用了。简直是疯了。 (2认同)

ken*_*orb 6

放置在文件夹中的每个脚本/etc/cron.hourly将每小时运行一次。

但是您的文件需要是:

  • 可执行文件,
  • 匹配 Debian cron 脚本命名空间(^[a-zA-Z0-9_-]+$)

因此,例如,如果您的脚本带有扩展名(.sh在本例中),它将无法工作。

要打印将运行的脚本的名称,请尝试:

sudo run-parts --report --test /etc/cron.hourly
Run Code Online (Sandbox Code Playgroud)