systemd
Ich habe die Dokumentation hier durchgesehenhttps://www.freedesktop.org/software/systemd/man/systemd.service.html.
Es heißt im ExecStartPre=,ExecStartPost=
Abschnitt
Beachten Sie, dass, wenn einer der in ExecStartPre=, ExecStart= oder ExecStartPost= angegebenen Befehle fehlschlägt (und nicht mit "-" beginnen, siehe oben) oder eine Zeitüberschreitung eintritt, bevor der Dienst vollständig aktiv ist, die Ausführung mit den in ExecStopPost= angegebenen Befehlen fortgesetzt wird und die Befehle in ExecStop= übersprungen werden.
Ich habe eine ExecStartPre
Regel:
ExecStartPre=/bin/false
In ExecStopPost
habe ich eine /bin/echo "I'm at ExecStopPost"
.
Der Service sieht aus wie
[Unit]
Description=Test
[Service]
Type=oneshot
ExecStartPre=/bin/echo "I'm at ExecStartPre"
ExecStartPre=/bin/false
ExecStart=/bin/echo "Running Test"
ExecStopPost=/bin/echo "I'm at ExecStopPost"
Wenn es läuft und fehlschlägt, sehe ich es nie. Die Ausgabe von Syslog sieht so aus
15. Juni 20:48:01 ip-10-0-0-246 echo[8687]: Ich bin bei ExecStartPre
15. Juni 20:48:01 ip-10-0-0-246 systemd[1]: test.service: Kontrollprozess beendet, Code=exited Status=1
15. Juni 20:48:01 ip-10-0-0-246 systemd[1]: Test konnte nicht gestartet werden.
15. Juni 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: Einheit ist in den Fehlerzustand gewechselt.
15. Juni 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: Fehlgeschlagen mit dem Ergebnis „Exitcode“.
Ich sehe mein Echo nie.
journalctl -u test.service
hat dies natürlich auch als Eintrag.
Muss ich das etwas anders konfigurieren? Oder muss ich verwenden OnFailure
?
Ich muss in der Lage sein, Conflicts=
bei Erfolg oder Misserfolg einen Neustart durchzuführen. Dies wird in Oneshot-Diensten verwendet, die durch Timer ausgelöst werden.
Oh, und das läuft auf 16.04.6 LTS.
Antwort1
Es scheint, dass oneshot
Dienste bei Fehlern nicht aufgerufen werden ExecStopPost
. Dieser Link erläutert dieshttps://bugzilla.redhat.com/show_bug.cgi?id=1353039.
Der entsprechende Beitrag ist
ExecStopPost wird nur ausgeführt, wenn die Einheit aus dem laufenden Zustand herauswechselt (auch wenn die Einheit beendet wird) oder wenn Main PID erfolgreich beendet wird, während es sich im Aktivierungszustand befindet und der Dienst nicht vom Forking-Typ ist.
Der Unterschied besteht darin, dass sich der Oneshot-Dienst bei der Ausführung konfigurierter ExecStart-Aktionen noch im Aktivierungszustand befindet und nicht ausgeführt wird. Bei einem einfachen Dienst überführt systemd den Dienst jedoch sofort in den Ausführungszustand, systemctl blockiert nicht und exit 0 wird zurückgegeben, selbst wenn ExecStart fehlschlägt (d. h. ExecStart=/bin/false). Der Oneshot-Dienst muss daher sauber beendet werden, damit ExecStopPost aufgerufen werden kann. Soweit ich weiß, hat die Option RemainAfterExit keine Auswirkungen auf ExecStopPost.
Die Lösung bestand letztendlich darin, einen hinzuzufügen, OnFailure
um die erforderlichen Elemente aufzurufen, die aufgerufen worden wärenExecStopPost