Ich habe einige Linux-Boxen, auf denen jeweils ein Dienst läuft. Dies ist der einzige wichtige Prozess, der auf diesen Maschinen läuft. Manchmal stoppt sich der Dienst jedoch aufgrund interner Statusänderungen mit dem Exit-Code 0 selbst. Ich suche nach einer idiomatischen Möglichkeit, das gesamte System herunterzufahren, wenn dies geschieht. Grundsätzlich möchte ich, dass systemd das System anhält, wenn der Dienst myservice mit dem Code 0 beendet wird, und myservice neu startet, wenn er mit einem Ergebniscode ungleich Null beendet wird.
Gibt es eine einfache Möglichkeit, dies zu tun?
Antwort1
/etc/systemd/system/my_unit.service
:
[Unit]
...
...
[Service]
Type=oneshot
ExecStart=/usr/bin/your_program
ExecStartPost=/usr/bin/systemctl poweroff
RestartSec=5
Restart=on-failure
[Install]
...
...
Es ist ganz einfach. Weitere interessante Parameter finden Sie in man systemd.service
und man systemd.unit
.
Antwort2
[Unit]
...
[Service]
Type=exec # or any other type you want, apart from "oneshot"
ExecStart=/usr/bin/your_program
ExecStopPost=/bin/sh -c \
'if [ "$SERVICE_RESULT" = "success" ]; then systemctl poweroff; fi'
RestartSec=5
Restart=on-failure
Wenn Ihr Dienst mit geschrieben ist Type=oneshot
, benötigen Sie das Muster inOxyds Antwortstattdessen. Die Verwendung Type=oneshot
für einen lang laufenden Dienst ist möglicherweise nicht sehr „idiomatisch“. Wenn das Programm ausgeführt wird, wird der Status solcher Dienste als „wird gestartet“ und nicht als „wird ausgeführt“ angezeigt.
Keines dieser Muster ist besonders elegant, aber es ist relativ einfach zu schreiben und ich denke, sie sollten gut funktionieren :-).