Die vorgeschlagene Lösung besteht darin, das Service-Gerät als normalen Service zu betreiben - siehe [Install]
Abschnitt. Also muss alles umgekehrt gedacht werden, auch Abhängigkeiten. Weil die Reihenfolge des Herunterfahrens die umgekehrte Startreihenfolge ist. Deshalb muss das Skript eingefügt werden ExecStop=
.
Die folgende Lösung funktioniert für mich:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
wird benötigt, wenn Sie keine ExecStart
Aktion haben.
Stellen Sie nach dem Erstellen der Datei sicher, dass systemctl daemon-reload
und systemctl enable yourservice --now
.
Ich habe es gerade von systemd IRC bekommen, Credits gehen an mezcalero.
ExecStart=/bin/true
.RemainAfterExit=true
erforderlich ist, wenn keine vorhandenExecStart
ist, weilsystemd
ich nicht versuchen werde, auszuführen,ExecStop
wenn ich der Meinung bin, dass der Dienst nicht ausgeführt wird.RemainAfterExit=true
veranlasstsystemd
zu glauben, dass der Dienst ausgeführt wird, wodurch erExecStop
beim Herunterfahren ausgeführt wird.Note that it is usually not sufficient to specify a command for this setting that only asks the service to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do so.
Soweit ich sehen kann, macht das, was ich brauche (aber ich weiß nicht genau warum).
quelle
kexec.target
das Vorher-Bit hinzufügenWantedBy=shutdown.target reboot.target halt.target
den[Unit]
Abschnitt hinzufügen .Before=
&After=
Abhängigkeiten nicht ändern.Um einen Dienst direkt vor dem Starten eines der Dienste reboot / shutdown / halt / kexec auszuführen (dh im letzten Moment, bevor das Root-Dateisystem wieder schreibgeschützt wird), verwenden Sie diese Dienstkonfiguration:
Aktivieren Sie es mit:
Um ein Skript direkt vor dem eigentlichen Neustart / Herunterfahren / Anhalten / Kexec auszuführen (wenn Sie nicht in das Root-Dateisystem schreiben können, da es schreibgeschützt erneut bereitgestellt wurde), fügen Sie dieses ausführbare Skript dem
/usr/lib/systemd/system-shutdown
Verzeichnis hinzu.Siehe auch:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
quelle
final.target
. Idealerweise möchte ich, dass es das erste ist, was nach dem Benutzer ausgeführt wird$ sudo reboot
.Ich bin nicht ganz sicher, aber ich glaube nicht, dass Sie den Installationsteil benötigen, obwohl ich ihn explizit hinzugefügt habe. Ich habe es auch nicht getestet, aber ich denke, es sollte Ihnen den Einstieg erleichtern:
quelle