Reset / Ingnore Nicht-Null-Exit-Code mit Flotte / Systemd

9

Ich habe einen backup.service , der jede Stunde von einem backup.timer aufgerufen wird . Leider kann das im Container ausgeführte Sicherungsskript erfolgreich abgeschlossen werden, wobei jedoch Warnungen einen Exit-Code ungleich Null zurückgeben. Obwohl möglicherweise alles funktioniert hat, stoppt der Container mit einem Exitcode ungleich Null. Die Einheit tritt also in der Flotte in einen ausgefallenen Zustand ein.

Und in diesem Fall scheint der Timer dieses Gerät nicht erneut zu starten, obwohl ich in den systemd-Dokumenten nichts gefunden habe, was dies sagt.

Um es klar zu machen: Es ist für mich vollkommen in Ordnung, den Container mit einem Exit-Code ungleich Null anhalten zu lassen. Aber mein Timer funktioniert dann nicht.

Ich könnte dieses Skript jetzt in einem anderen zusammenfassen, das dann als Docker-Einstiegspunkt bezeichnet wird. Aber ich muss sicherstellen, dass die Ausgabe auf STDOUT und STDERR irgendwie erhalten bleibt.

Ich könnte auch sudo systemctl reset-failed ausführen, nachdem das Gerät ausgefallen ist, aber das scheint mir ein wenig hackig zu sein ... (Ich habe das versucht und in diesem Fall hat der Timer das Gerät erneut ausgeführt. Aber es funktioniert nicht als ExecStopPost -Aufgabe in der Servicedatei)

Gibt es einen besseren Weg, um sicherzustellen, dass eine Einheit

  • tritt nicht in den Status "Fehlgeschlagen" ein, obwohl er ungleich Null zurückgibt, oder
  • Setzen Sie den Status danach zurück oder
  • Sagen Sie dem Timer, dass er das Gerät ausführen soll, obwohl sein Status fehlgeschlagen ist .
Julian Kaffke
quelle

Antworten:

6

Sie können Ihrem Befehl ein Präfix voranstellen -, dann ignoriert systemd den Fehler und versetzt das Gerät nicht in einen fehlerhaften Zustand. Also statt

ExecStart=/path/to/your/command 

Versuchen

ExecStart=-/path/to/your/command 

Weitere Informationen finden Sie in der Manpage systemd .

Paul Dixon
quelle
2
Glaub es oder nicht. Ich habe ungefähr 15 Service-Dateien mit genau den -in meinen ExecPre-Tasks. Ich habe das einfach nicht als Lösung erkannt ... Du hast meinen Tag gemacht. Vielen Dank
Julian Kaffke
2

Falls Sie ignorieren einige Rückgabewerte, wollen aber noch einige andere zählen als Fehler systemd, können Sie sie in den angeben [Service]Abschnitt Ihrer .service Datei als durch Leerzeichen getrennte Liste zu SuccessExitStatus, RestartPreventExitStatusund RestartForceExitStatus. Diese nehmen auch Signalnamen an.

Referenz: man 5 systemd.service

azrdev
quelle