你如何使用run-parts命令?


8

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

什么crontab?你这里没有crontab。你为什么run-parts还在使用?为什么不直接运行脚本?
terdon 2014年

我没有显示crontab,因为我已将问题隔离到此命令。至于为什么运行部件我有很多用户每个站点一个,我只使用/ home / username / cron / hourly等文件夹,这样更方便,然后必须一直编辑crontab(只需更新git项目和他们将跑...)
Fabian Barkhau 2014年

Answers:


13

问题是您的脚本的名称。来自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-hfoo.-sh将工作。我不知道他们为什么这样做,但可能是他们遵循一些标准或其他标准。

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

find /home/fabe/tmp/ -prune -type f -executable -exec {} \;

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


这是非常奇怪的,因为在RHEL上有一个名为0yum-hourly.cronrun-parts的文件
Ray Foss

谢谢!我拉着头发试图理解为什么“busybox”版本的run-parts拒绝找到我的“test.sh”脚本。将其重命名为“test”,现在可以正常运行。只是疯了。
Daniele Testa

3

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

但是你的文件必须是:

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

因此,例如,如果你有扩展脚本(.sh在这种情况下),它将无法正常工作。

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

sudo run-parts --report --test /etc/cron.hourly
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.