Raspberry PI / systemd: Skript beim Herunterfahren/Ausschalten ausführen, aber nicht beim Neustart

Raspberry PI / systemd: Skript beim Herunterfahren/Ausschalten ausführen, aber nicht beim Neustart

Auf Raspberry PI (mit Raspbian) muss ich das Skript ausführen aufabschalten/ausschalten, Abernicht beim Neustart.

Mein erster Versuch bestand darin, einen Dienst wie folgt zu definieren:

[Unit]
Description=Power off service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/bin/poweroff.sh

[Install]
WantedBy=multi-user.target

Das hat funktioniert, aber das Skript lief auch beim Neustart. Also habe ich versucht, es auf einem anderen Ziel zu installieren:

[Install]
WantedBy=shutdown.target halt.target

Aber nach dieser Änderung wird das Skript überhaupt nicht mehr ausgeführt.

Wie lassen sich Aktionen, die beim Herunterfahren ausgeführt werden sollen, richtig definieren?

Antwort1

Soweit ich das im Internet herausgefunden habe, besteht die beste Option darin, Conflicts=reboot.targetdie Unit-Datei ( [Unit]Abschnitt) zu haben und dann Folgendes im Skript auszuführen:

systemctl list-jobs | egrep -q 'reboot.target.*start'

Wenn reboot.targetder Start geplant ist, handelt es sich um einen Neustart. Andernfalls ist dies nicht der Fall. Wenn der Befehl „erfolgreich“ ist, wird das System neu gestartet. Andernfalls wird es heruntergefahren. Sie können es folgendermaßen verwenden:

if ! systemctl list-jobs | egrep -q 'reboot.target.*start'; then
  echo Shutting down
fi

Antwort2

Daniels Antwort löst das Problem in der Frage. Aber es war immer noch nicht genau das, was ich brauchte: Das Skript wurde zu früh aufgerufen und ich brauchte es, damit es so spät wie möglich ausgeführt wird (das Skript schaltet den Strom tatsächlich mithilfe des Relais ab, das an den GPIOPin des RPi angeschlossen ist).

Nachdem ich etwas mehr Zeit investiert hatte, fand ich eine viel einfachere Lösung, die genau das tat, wonach ich gesucht hatte:

  1. Verzeichnis erstellen /etc/systemd/system/systemd-poweroff.service.d, falls noch nicht vorhanden
  2. Erstellen Sie eine neue Datei poweroff.confim /etc/systemd/system/systemd-poweroff.service.dVerzeichnis:
[Service]
ExecStartPre=/usr/local/bin/poweroff.sh

Mit diesem Ansatz ist es nicht notwendig, einen neuen Dienst hinzuzufügen

verwandte Informationen