Warum wird dieses Skript in cron.daily nicht ausgeführt?

Warum wird dieses Skript in cron.daily nicht ausgeführt?

Ich habe dieses kleine Python-Skript geschrieben, um tägliche Backups eines Verzeichnisses mit einigen Dateien zu erstellen (die Backups sollten nach einer Woche rotieren). Das ist es:

$ 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()

Wenn ich es manuell ausführe, funktioniert es wie erwartet und erstellt ein Sicherungsverzeichnis, das nach dem aktuellen Wochentag benannt ist. Es wird aber nicht täglich ausgeführt: Ich habe es drei Tage lang in /etc/cron.daily gelassen und danach wurde kein Sicherungsverzeichnis mehr erstellt, der Server war die ganze Zeit eingeschaltet.

Die Berechtigungen sind richtig:

$ 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

Das System ist Ubuntu Server 12.04.2 LTS und die Cron-Konfiguration wurde seit der Installation nicht manipuliert.

Warum wird das Skript nicht ausgeführt?

Antwort1

Dies liegt daran, dass Ihr Skript eine .pyErweiterung hat. Die Dateien in /etc/cron.dailywerden ausgeführt vonLaufteile(8)Befehl und standardmäßig werden Programme ignoriert, die nicht bestimmten Regeln entsprechen. Sie sollten die .pyErweiterung einfach entfernen können.

run-parts führt alle ausführbaren Dateien aus, die im Verzeichnis directory liegen und innerhalb der unten beschriebenen Einschränkungen benannt sind. Andere Dateien und Verzeichnisse werden stillschweigend ignoriert.

Wenn weder die Option --lsbsysinit noch die Option --regex angegeben ist, müssen die Namen vollständig aus ASCII-Groß- und Kleinbuchstaben, ASCII-Ziffern, ASCII-Unterstrichen und ASCII-Minus-Bindestrichen bestehen.

Zum Beispiel

touch /etc/cron.daily/test.py
chmod +x /etc/cron.daily/test.py
run-parts --test /etc/cron.daily
/etc/cron.daily/apache2
...

keine Spur von 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

ta da!

Antwort2

Sollte der Cron-Eintrag nicht so aussehen 0 * * * 1-7 root /etc/cron.daily/file-store-backup.py

Normalerweise füge ich das eigentliche Skript nicht in die Cron-Datei ein, sondern verweise in der Datei auf das Skript.

verwandte Informationen