Hinweis: Eine kurz formulierte Frage finden Sie unten.
Ich habe ein Skript, das eine Sicherungskopie meiner Dateien auf einem externen USB-Laufwerk erstellt. Die Ausführung kann eine Weile dauern, je nachdem, wie viele neue Daten ich erstellt habe. Ich möchte es automatisch bei jedem Herunterfahren des Systems ausführen.
Ich benutze Fedora 23 mit den neuesten Updates (systemd).
Ich habe versucht, dies auf verschiedene Arten zu erreichen, aber ich konnte es nicht zum Laufen bringen.
Langfristiger Prozess mit StopExec
autobackup.service:
[Unit]
Description=Slow backup script
Requires=local-fs.target
[Service]
ExecStart=/bin/true
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multiuser.target
Ich habe es mit aktiviert und mit systemctl enable autobackup.service
gestartet systemctl start autobackup.service
.
Teil meines Bootlogs ( journalctl -b-1
):
Dez 22 17:45:27 localhost systemd[1]: Unmounted /mnt/BACKUP.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At subvol /home/BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: parent subvol is not reachable from inside the root subvol.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At snapshot BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: failed to dump stream. Broken pipe
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Control process exited, code=exited status=1
Dez 22 17:45:27 localhost systemd[1]: Stopped Slow backup script.
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Unit entered failed state.
Beachten Sie, dass ich nichts dazwischen verkürzt habe, es hat / mnt / BACKUP wirklich kurz vor dem Start des Skripts abgehängt, lustiger Zufall.
Vor dem Herunterfahren.Ziel
autobackup.service:
[Unit]
Description=Slow backup script
DefaultDependencies=no
Before=shutdown.target
[Service]
ExecStart=/etc/systemd/system/do_backup.sh
Type=oneshot
systemctl edit shutdown.target
[Unit]
Requires=autobackup.service
Die Ausgabe ist grundsätzlich gleich.
Das Problem
Ich denke, das Problem ist, dass systemd mein Skript in beiden Fällen parallel zu allen anderen Shutdown-Skripten startet, die BACKUP aushängen und die Pipe-Infrastruktur deaktivieren (ein weiterer Fehler, den ich manchmal bekam, wenn das Aushängen nicht schnell genug war).
Die Frage
Wie kann ich systemd beibringen, mein Skript zuerst beim Herunterfahren zu starten, zu warten, bis es beendet wird, und dann den Rest der Skripte / Ziele / Einheiten / was auch immer zum Herunterfahren zu starten?
quelle
/lib/systemd/system-shutdown/
. Beachten Sie außerdem, dass diese Skripts sehr spät beim Herunterfahren ausgeführt werden, nachdem Dateisysteme bereits schreibgeschützt bereitgestellt wurden. Jeder Schreibzugriff auf das Dateisystem schlägt fehl, sofern er nicht als read-write (mount -oremount,rw /
) erneut bereitgestellt wird . Weitere Informationen finden Sie unter Ausführen von Skripten in / usr / lib / systemd / system-shutdown / beim Neustart oder Herunterfahren.Ich hab es geschafft!
Nimm die Lösung Langfristiger Prozess mit StopExec und ändere ihn wie folgt :
autobackup.service:
Beachten Sie die Zeile:
Es funktioniert so wie erwartet.
quelle
systemctl edit
.systemctl enable autobackup
hat den gleichen Effekt und ist mehr idiomatisch und sollte funktionieren, da Sie bereits den[Install]
Abschnitt in Ihrem Gerät haben. Sie müssen diesen Tippfehler jedoch im Zielnamen korrigieren. ;)