systemd ExecStopPost wird nicht ausgeführt, wenn ExecStartPre fehlschlägt?

systemd ExecStopPost wird nicht ausgeführt, wenn ExecStartPre fehlschlägt?

systemdIch 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 ExecStartPreRegel:

ExecStartPre=/bin/false

In ExecStopPosthabe 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.servicehat 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 oneshotDienste 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, OnFailureum die erforderlichen Elemente aufzurufen, die aufgerufen worden wärenExecStopPost

verwandte Informationen