Die vorgeschlagene Lösung besteht darin, die Service-Unit als normalen Dienst auszuführen - siehe [Install]
Sektion. Also muss alles umgekehrt gedacht werden, auch Abhängigkeiten. Denn die Abschaltreihenfolge ist die umgekehrte Startreihenfolge. Deshalb muss das Skript in ExecStop=
platziert werden .
Die folgende Lösung funktioniert bei mir:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
wird benötigt, wenn Sie kein ExecStart
haben Aktion.
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.
-
So führen Sie einen Dienst direkt vor dem Start aus Jeder der Reboot/Shutdown/Halt/Kexec-Dienste (d. h. im letzten Moment, bevor das Root-Dateisystem wieder schreibgeschützt gemountet wird) verwendet 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 auszuführen reboot/shutdown/halt/kexec (wenn Sie nicht in das Root-Dateisystem schreiben können, weil es schreibgeschützt neu gemountet wurde) fügen Sie dieses ausführbare Skript zu
/usr/lib/systemd/system-shutdown
hinzu Verzeichnis.Unmittelbar vor der Ausführung des eigentlichen Systemstopps/poweroff/reboot/kexec führt systemd-shutdown alle ausführbaren Dateien in /usr/lib/systemd/system-shutdown/ aus und übergibt ihnen ein Argument:entweder „halt“, „poweroff“, „reboot " oder "kexec", je nach gewählter 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 beendet sind.
Siehe auch:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
Soweit ich sehen kann, tut dies, 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