Назад | Перейти на главную страницу

Почему этот скрипт в 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 не была изменена с момента установки.

Почему не запускается скрипт?

Это происходит потому, что в вашем скрипте есть .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

да да!

Разве запись cron не должна выглядеть как 0 * * * 1-7 root /etc/cron.daily/file-store-backup.py

Я обычно не помещаю фактический сценарий в файл cron, обычно я ссылаюсь на сценарий в файле.