Automatischer Neustart des Systemd-Dienstes nach StartLimitInterval


33

Ich möchte, dass mein systemd-Dienst bei einem Fehler automatisch neu gestartet wird. Zusätzlich möchte ich die Neustarts einschränken. Ich möchte maximal 3 Neustarts innerhalb von 90 Sekunden zulassen. Daher habe ich folgende Konfiguration vorgenommen.

[Service]
Neustart = immer
StartLimitInterval = 90
StartLimitBurst = 3

Jetzt wird der Dienst bei einem Fehler neu gestartet. Nach 3 schnellen Fehlern / Neustarts wird nicht mehr wie erwartet neu gestartet. Jetzt erwartete ich, dass das Systemd den Dienst nach dem Timeout (StartLimitInterval) startet. Das System startet den Dienst jedoch nicht automatisch nach Ablauf der Zeit (90 Sekunden), wenn ich den Dienst nach Ablauf der Zeit manuell neu starte. Ich möchte aber, dass das Systemd den Dienst nach dem StartLimitInterval automatisch startet. Bitte lassen Sie mich wissen, wie Sie diese Funktion erreichen können.


3
Ich habe einen Artikel geschrieben, in dem erklärt wird, wie ein Dienst erstellt wird und wie dieses spezielle Problem vermieden wird : Erstellen eines Linux-Dienstes mit systemd .
Benjamin

2
Ich denke, Sie suchen StartLimitIntervalSec, nicht StartLimitInterval.
Marc Tamsky

Antworten:


29

Um einen dreimaligen Neustart des Dienstes in Intervallen von 90 Sekunden zu veranlassen, fügen Sie die folgenden Zeilen in Ihre systemd-Dienstdatei ein:

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

Dies hat bei mir für einen Dienst funktioniert, der ein Skript mit 'Type = idle' ausführt. Beachten Sie, dass 'StartLimitInterval' größer als 'RestartSec * StartLimitBurst' sein muss, da der Dienst sonst auf unbestimmte Zeit neu gestartet wird.

Ich habe einige Zeit mit viel Versuch und Irrtum gebraucht, um herauszufinden, wie systemd diese Optionen verwendet, was darauf hindeutet, dass systemd nicht so gut dokumentiert ist, wie man es sich erhofft. Diese Optionen bieten effektiv die Wiederholungszykluszeit und die maximalen Wiederholungsversuche, die ich gesucht habe.


Dies sollte als akzeptierte Antwort markiert werden ...
Jeff

StartLimitInterval=Ich kann keine Anweisung in meinem neuesten Ubuntu 18 finden ...
Docht

10

Das von Ihnen beschriebene Verhalten stimmt mit der Dokumentation überein:

StartLimitInterval =, StartLimitBurst = Dienststartratenbegrenzung konfigurieren. Standardmäßig dürfen Dienste, die innerhalb von 10 Sekunden mehr als fünf Mal gestartet wurden, erst nach Ablauf des 10-Sekunden-Intervalls mehrmals gestartet werden. Mit diesen beiden Optionen kann diese Ratenbegrenzung geändert werden. Verwenden Sie StartLimitInterval =, um das Überprüfungsintervall zu konfigurieren (standardmäßig DefaultStartLimitInterval = in der Manager-Konfigurationsdatei auf 0 gesetzt, um jede Art von Ratenbeschränkung zu deaktivieren). Verwenden Sie StartLimitBurst =, um zu konfigurieren, wie viele Starts pro Intervall zulässig sind (standardmäßig DefaultStartLimitBurst = in der Manager-Konfigurationsdatei). Diese Konfigurationsoptionen sind besonders nützlich in Verbindung mit Restart =; Sie gelten jedoch für alle Arten von Starts (einschließlich manueller Starts), nicht nur für Starts, die durch die Restart = -Logik ausgelöst werden.Beachten Sie, dass Einheiten, die für Restart = konfiguriert sind und die Startgrenze erreichen, nicht mehr versucht werden, neu gestartet zu werden. Sie können jedoch zu einem späteren Zeitpunkt immer noch manuell neu gestartet werden. Ab diesem Zeitpunkt wird die Neustartlogik wieder aktiviert. Beachten Sie, dass systemctl reset-failed dazu führt, dass der Zähler für die Neustartrate für einen Dienst gelöscht wird. Dies ist hilfreich, wenn der Administrator einen Dienst manuell starten möchte und das Startlimit dies beeinträchtigt.

Ich versuche immer noch, einen Weg zu finden, um das gewünschte Verhalten zu erreichen.


Dies ist eher ein Kommentar als eine Antwort, wie Sie betonen.
Dave M

genau das, was ich brauchte, ty
Einige Linux-Nerd

Sollte es laut der Dokumentation, die Sie verlinkt haben, nicht StartLimitIntervalSec=(und DefaultStartLimitIntervalSec=) sein? Beachten Sie das Hinzufügen von Seczu beiden Parameternamen.
Doktor J

6

Einige Jahre später und mit systemd 232 es mehr dosn't Arbeit wie in der Frage und die Antworten von 2016. Option Namen beschrieben StartLimitIntervalSecund Abschnitten geändert haben. Nun muss es so aussehen:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

Dies führt 5 Neustarts in 30 Sekunden (5 * 6) und einen Neustart in 33 Sekunden durch. Wir haben also 6 Neustarts in 33 Sekunden. Dies überschreitet die Grenze von 5 Neustarts in 33 Sekunden. Neustarts werden also nach ca. 31 Sek. Bei 5 Zählern gestoppt.


1
Es sieht so aus StartLimitInterval, als ob es in diesem ServiceAbschnitt immer noch unterstützt wird, wenn es nicht dokumentiert ist . Aber der neue, bevorzugte StartLimitIntervalSecfunktioniert nur in Unit.
Danek Duvall

1

Sie können festlegen OnFailure, dass ein anderer Dienst gestartet wird, wenn dies fehlschlägt. Im On-Fail-Dienst können Sie ein Skript ausführen, das wartet und dann Ihren Dienst neu startet.

Ein Beispiel zur Einrichtung finden Sie unter Systemd-Status-Mail bei Geräteausfall, und ändern Sie es, um stattdessen den Dienst neu zu starten.


1

Sie können verwenden StartLimitAction=reboot. Dadurch wird das System nach dem StartLimitInterval neu gestartet.

StartLimitAction = Konfigurieren Sie die Aktion, die ausgeführt werden soll, wenn das mit StartLimitInterval = und StartLimitBurst = konfigurierte Ratenlimit erreicht wird. Nimmt eine der folgenden Optionen an: Neustart, Neustart erzwingen oder Sofort-Neustart. Wenn keine festgelegt ist, löst das Überschreiten des Ratenlimits keine Aktion aus, außer dass der Start nicht zulässig ist. Durch einen Neustart wird ein Neustart nach dem normalen Herunterfahren (dh entsprechend dem Neustart von systemctl) ausgeführt. reboot-force bewirkt einen erzwungenen Neustart, der alle Prozesse zwangsweise beendet, aber beim Neustart keine fehlerhaften Dateisysteme verursachen sollte (dh äquivalent zu systemctl reboot -f), und reboot-instant bewirkt die sofortige Ausführung des Systemaufrufs reboot (2), der möglicherweise zur Folge hat im Datenverlust. Der Standardwert ist none.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.