為什麼 cron.daily 中的這個腳本無法運作?

為什麼 cron.daily 中的這個腳本無法運作?

我編寫了這個小型 Python 腳本來對包含一些檔案的目錄進行每日備份(備份應在一周後輪換)。就是這個:

$ 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 運行在下面描述的約束內命名的所有可執行文件,在目錄目錄中找到。其他文件和目錄將被默默忽略。

如果未給予 --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 檔案中,通常我會引用檔案中的腳本。

相關內容