it-swarm.com.de

Wie führe ich ein Skript mit systemd direkt vor dem Herunterfahren aus?

Was muss ich in den Abschnitt [install] Einfügen, damit systemd /home/me/so.pl Direkt vor dem Herunterfahren und auch vor der Zerstörung von /proc/self/net/dev Ausführt?

[Unit]
Description=Log Traffic

[Service]
ExecStart=/home/me/so.pl

[Install]
?
64
sid_com

Die vorgeschlagene Lösung besteht darin, die Serviceeinheit als normalen Service auszuführen. Schauen Sie sich den Abschnitt [Install] An. Also muss alles umgekehrt gedacht werden, auch Abhängigkeiten. Weil die Reihenfolge des Herunterfahrens die umgekehrte Startreihenfolge ist. Deshalb muss das Skript in ExecStop= Platziert werden.

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 vom systemd IRC bekommen, Credits gehen an mezcalero.

76
Matthias

Soweit ich sehen kann, macht dies 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
8
sid_com
  • So führen Sie einen Dienst direkt vor dem Start eines der Dienste zum Neustarten/Herunterfahren/Anhalten/Kexec aus (dh im letzten Moment, bevor das Root-Dateisystem schreibgeschützt erneut bereitgestellt 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
    
  • So führen Sie ein Skript direkt vor dem tatsächlichen Neustart/Herunterfahren/Anhalten/kexec aus (wenn Sie nicht in das Root-Dateisystem schreiben können, weil es schreibgeschützt erneut bereitgestellt wurde) Fügen Sie diese ausführbare Skriptdatei zum /usr/lib/systemd/system-shutdown Verzeichnis.

    Unmittelbar vor dem eigentlichen Ausführen des eigentlichen Systemstopps/Ausschaltens/Neustarts/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 ", 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

6

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 beim Einstieg helfen:

[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
6
Ulrich Dangel