为什么 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 运行目录 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 文件中,通常我会引用文件中的脚本。

相关内容