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.target
die Unit-Datei ( [Unit]
Abschnitt) zu haben und dann Folgendes im Skript auszuführen:
systemctl list-jobs | egrep -q 'reboot.target.*start'
Wenn reboot.target
der 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 GPIO
Pin 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:
- Verzeichnis erstellen
/etc/systemd/system/systemd-poweroff.service.d
, falls noch nicht vorhanden - Erstellen Sie eine neue Datei
poweroff.conf
im/etc/systemd/system/systemd-poweroff.service.d
Verzeichnis:
[Service]
ExecStartPre=/usr/local/bin/poweroff.sh
Mit diesem Ansatz ist es nicht notwendig, einen neuen Dienst hinzuzufügen