为什么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() 

当我手动运行它时,它按预期工作,创build一个以本周的一天命名的备份目录,但不是每天运行:我将它留在/etc/cron.daily里面3天,之后没有创build备份目录,服务器一直在运行。

权限是正确的:

 $ 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,从安装以来cronconfiguration没有被篡改。

为什么脚本没有运行?

这是因为你的脚本有一个.py扩展名。 /etc/cron.daily中的文件由run-parts(8)命令运行,默认是忽略不符合各种规则的程序。 你应该能够删除.py扩展名。

运行部分运行在目录目录中find的下面描述的约束内命名的所有可执行文件。 其他文件和目录被忽略。

如果既没有给出–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 

达达!

cron条目不应该是0 * * * 1-7 root /etc/cron.daily/file-store-backup.py

我通常不会将实际的脚本放在cron文件中,通常是指文件中的脚本。