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=truewird benötigt, wenn Sie keine ExecStartAktion haben.
Stellen Sie nach dem Erstellen der Datei sicher, dass systemctl daemon-reloadund systemctl enable yourservice --now.
Ich habe es gerade von systemd IRC bekommen, Credits gehen an mezcalero.
RemainAfterExit=true erforderlich ist, wenn keine vorhanden ExecStartist, weil systemdich nicht versuchen werde, auszuführen, ExecStopwenn ich der Meinung bin, dass der Dienst nicht ausgeführt wird. RemainAfterExit=trueveranlasst systemdzu glauben, dass der Dienst ausgeführt wird, wodurch er ExecStopbeim 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.targetdas Vorher-Bit hinzufügen
WantedBy=shutdown.target reboot.target halt.targetden [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-shutdownVerzeichnis 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.