web-dev-qa-db-ja.com

run-partsコマンドをどのように使用しますか?

何らかの理由で、私のcrontabはhourly/weekly/etcスクリプトを実行していません。 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
9
Fabian Barkhau

問題はスクリプトの名前です。 man run-partsから:

--lsbsysinitオプションも--regexオプションも指定されていない場合、名前は完全にASCII大文字と小文字、ASCII数字、ASCIIアンダースコア、およびASCIIマイナスハイフン。

言い換えれば、拡張子はありません。奇妙なことに、--lsbsysinitオプションを使用しても、対象となる名前空間のいずれにも一致しないため、foo.shのようなファイルを指定することはできません。

--lsbsysinitオプションを指定する場合、名前は.dpkg-oldまたは.dpkg-distまたは.dpkg-newまたは.dpkg-tmpで終わることはできず、次の名前空間の1つ以上に属している必要があります。LANANA割り当てられた名前空間(^ [a-z0-9] + $); LSB階層および予約済み名前空間(^ _?([a-z0-9_。] +-)+ [a-z0-9] + $);およびDebiancronスクリプト名前空間(^ [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 {} \;

上記のコマンドは、ターゲットディレクトリ内のすべての実行可能ファイルを検索して実行します。 -executableはGNU拡張子だと思いますが、これをLinuxとしてタグ付けしているので、GNU findがあると思います。

16
terdon

フォルダに配置されたすべてのスクリプト/etc/cron.hourlyは1時間ごとに実行されます。

ただし、ファイルは次のようにする必要があります。

  • 実行可能、
  • debiancronスクリプト名前空間に一致する(^[a-zA-Z0-9_-]+$)

たとえば、拡張子(.shこの場合)、それは機能しません。

実行されるスクリプトの名前を出力するには、次のことを試してください。

Sudo run-parts --report --test /etc/cron.hourly
3
kenorb