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 verwende Fedora 23 mit den neuesten Updates (systemd).
Ich habe versucht, dies auf verschiedene Arten zu erreichen, aber ich konnte es nicht zum Laufen bringen.
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 systemctl enable autobackup.service
aktiviert und mit systemctl start autobackup.service
gestartet.
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 sich wirklich kurz vor dem Start des Skripts/mnt/BACKUP abgemeldet, lustiger Zufall.
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.
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).
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?
Ich habe es verstanden!
Nimm Lösung Langfristiger Prozess mit StopExec und ändere ihn wie folgt:
autobackup.service:
[Unit]
Description=Slow backup script
RequiresMountsFor=/mnt/BACKUP /home
[Service]
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Beachten Sie die Zeile:
RequiresMountsFor=/mnt/BACKUP /home
Es funktioniert so wie erwartet.
Es müssen keine Servicedateien erstellt oder bearbeitet werden. Legen Sie einfach Ihr Skript ein
/usr/lib/systemd/system-shutdown/
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
Unmittelbar vor dem eigentlichen Systemhalt/Ausschalten/Neustart/Kexec führt systemd-shutdown alle ausführbaren Dateien in/usr/lib/systemd/system-shutdown/aus und übergibt ihnen ein Argument: entweder "Halt", "Ausschalten", "Neustart" "oder" kexec ", abhängig von der gewählten Aktion. Alle ausführbaren Dateien in diesem Verzeichnis werden parallel ausgeführt, und die Ausführung der Aktion wird nicht fortgesetzt, bevor alle ausführbaren Dateien abgeschlossen sind.
Ich benutze es, um einfach den PC-Lautsprecher zu piepen.