
Я написал этот небольшой скрипт на 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-файл, обычно я ссылаюсь на скрипт в файле.