Antworten:
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.
RemainAfterExit=true
erforderlich ist, wenn keine vorhanden ExecStart
ist, weil systemd
ich nicht versuchen werde, auszuführen, ExecStop
wenn ich der Meinung bin, dass der Dienst nicht ausgeführt wird. RemainAfterExit=true
veranlasst systemd
zu glauben, dass der Dienst ausgeführt wird, wodurch er ExecStop
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).
[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
[Service]
ExecStart=/usr/local/bin/perl /home/me/log_traffic.pl --stop
Type=oneshot
kexec.target
das Vorher-Bit hinzufügen
WantedBy=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:
[Unit]
Description=Save system clock on shutdown
DefaultDependencies=no
After=final.target
[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save
[Install]
WantedBy=final.target
Aktivieren Sie es mit:
systemctl enable my_service.service
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.
Unmittelbar vor dem eigentlichen Systemstopp / 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.
Siehe auch:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
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:
[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no
[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=shutdown.target
ExecStart=/bin/true
.