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