
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 .py
Erweiterung hat. Die Dateien in /etc/cron.daily
werden ausgeführt vonLaufteile(8)Befehl und standardmäßig werden Programme ignoriert, die nicht bestimmten Regeln entsprechen. Sie sollten die .py
Erweiterung 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.