wake-up-neo.com

Wie führe ich ein Skript vor allem anderen beim Herunterfahren mit systemd aus?

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.

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 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.

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?

16
le_me

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.

11
le_me

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.

11
Joost