GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

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

Linux
  1. Wie schreibe ich ein Startskript für Systemd?

  2. Linux – Wie bekommt man mit Systemd weniger Ttys?

  3. Wie konfiguriert man Systemd, um ein einfaches Skript mit Standardio in einen Netzwerkdienst umzuwandeln?

  4. Wie lässt sich ein Python-Skript als Dienst ausführen?

  5. Wie führe ich ein Skript vor allem anderen beim Herunterfahren mit systemd aus?

So führen Sie Container als Systemd-Dienst mit Podman aus

So führen Sie Shell-Skript als Systemd-Dienst in Linux aus

So führen Sie Pods als systemd-Dienste mit Podman aus

So richten Sie die automatische Ausführung eines Python-Skripts mit Systemd ein

So führen Sie Shell-Skript als SystemD-Dienst in Linux aus

So führen Sie ein Bash-Skript aus