cron.daily 内のこのスクリプトが実行されないのはなぜですか?

cron.daily 内のこのスクリプトが実行されないのはなぜですか?

いくつかのファイルを含むディレクトリのバックアップを毎日作成するための小さな Python スクリプトを作成しました (バックアップは 1 週間後にローテーションする必要があります)。内容は次のとおりです。

$ cat /etc/cron.daily/file-store-backup.py
#!/usr/bin/python3

import datetime
import calendar
import subprocess
import os.path

def main():
    origin = '/var/file-store'
    today_name = calendar.day_name[datetime.date.today().weekday()]
    dest = '/var/file-store-backup/' + today_name

    if os.path.exists(dest):
        subprocess.call(['rm', '-rf', dest])

    subprocess.call(['cp', '--reflink=always', '-a', origin, dest])
    subprocess.call(['touch', dest])

    last = open('/var/file-store-backup/LAST', 'w')
    print(today_name, file=last)

if __name__ == "__main__":
    main()

手動で実行すると、期待どおりに動作し、現在の曜日の名前が付いたバックアップ ディレクトリが作成されますが、毎日は実行されません。/etc/cron.daily 内に 3 日間放置しましたが、その後はバックアップ ディレクトリは作成されず、サーバーは常時オンのままでした。

権限は適切です:

$ ls -l /etc/cron.daily/file-store-backup.py 
-rwxr-xr-x 1 root root 553 Abr 11 17:19 /etc/cron.daily/file-store-backup.py

システムは Ubuntu Server 12.04.2 LTS であり、インストール以降 cron 設定は変更されていません。

スクリプトが実行されないのはなぜですか?

答え1

これはスクリプトに拡張子があるために発生します.py/etc/cron.dailyランパーツ(8)コマンドのデフォルトでは、さまざまなルールに一致しないプログラムを無視します。拡張子を削除するだけで済むはずです.py

run-parts は、ディレクトリ directory 内にある、以下に説明する制約内で名前が付けられたすべての実行可能ファイルを実行します。その他のファイルとディレクトリは黙って無視されます。

--lsbsysinit オプションも --regex オプションも指定されていない場合は、名前はすべて ASCII 大文字と小文字、ASCII 数字、ASCII アンダースコア、および ASCII マイナスハイフンで構成する必要があります。

例えば

touch /etc/cron.daily/test.py
chmod +x /etc/cron.daily/test.py
run-parts --test /etc/cron.daily
/etc/cron.daily/apache2
...

test.py の兆候なし

mv /etc/cron.daily/test.py /etc/cron.daily/test
run-parts --test /etc/cron.daily 
/etc/cron.daily/apache2
...
/etc/cron.daily/test

やったー!

答え2

cronエントリは次のようになるべきではないでしょうか 0 * * * 1-7 root /etc/cron.daily/file-store-backup.py

通常、実際のスクリプトを cron ファイルに入れることはなく、通常はファイル内のスクリプトを参照します。

関連情報