it-swarm.com.de

Systemd Service automatischer Neustart nach StartLimitInterval

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 die folgende Konfiguration vorgenommen.

[Bedienung]
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 habe ich erwartet, dass das System den Dienst nach dem Timeout startet (StartLimitInterval). Das System startet den Dienst jedoch nicht automatisch nach dem Timeout (90 Sekunden), wenn ich den Dienst nach dem Timeout manuell neu starte. Ich möchte jedoch, dass das System den Dienst nach dem StartLimitInterval automatisch startet. Bitte lassen Sie mich wissen, wie diese Funktion erreicht werden kann.

38
Dinesh P.R.

Um einen Dienst dreimal im Abstand von 90 Sekunden neu zu starten, 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, sonst wird der Dienst auf unbestimmte Zeit neu gestartet.

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 erhoffen würde. Diese Optionen bieten effektiv die Wiederholungszykluszeit und die maximalen Wiederholungsversuche, nach denen ich gesucht habe.

34
jross

Einige Jahre später und mit systemd 232 funktioniert es nicht mehr wie in der Frage und in den Antworten von 2016 beschrieben. Optionsname StartLimitIntervalSec und Abschnitte haben sich geändert. Jetzt 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) plus einen Neustart in 33 Sekunden durch. Wir haben also 6 Neustarts in 33 Sekunden. Dies überschreitet die Grenze von 5 Neustarts in 33 Sekunden. Der Neustart stoppt also nach ca. 31 Sekunden bei 5 Zählungen.

12
Ingo

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

StartLimitInterval =, StartLimitBurst = Konfigurieren Sie die Begrenzung der Dienststartrate. Standardmäßig dürfen Dienste, die mehr als fünfmal innerhalb von 10 Sekunden gestartet werden, erst nach Ablauf des 10-Sekunden-Intervalls mehr 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 Ratenbegrenzung 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 solche, die durch die Restart = -Logik ausgelöst werden. Beachten Sie, dass Einheiten, die für Restart = konfiguriert sind und das Startlimit erreichen, nicht mehr versucht werden, neu gestartet zu werden. Sie können jedoch zu einem späteren Zeitpunkt noch manuell neu gestartet werden. Ab diesem Zeitpunkt wird die Neustartlogik erneut aktiviert. Beachten Sie, dass das Zurücksetzen der Systemsteuerung fehlgeschlagen ist und den Zähler für die Neustartrate für einen Dienst auslöst gespült werden, was nützlich ist, 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.

11
Youssef Eldakar

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

StartLimitAction = Konfigurieren Sie die auszuführende Aktion, wenn das mit StartLimitInterval = und StartLimitBurst = konfigurierte Ratenlimit erreicht wird. Nimmt eine von keiner, Neustart, Neustart erzwingen oder Neustart sofort. Wenn keine festgelegt ist, löst das Erreichen des Ratenlimits keine Aktion aus, außer dass der Start nicht zulässig ist. Ein Neustart führt zu einem Neustart nach dem normalen Herunterfahren (d. h. entspricht einem Neustart von systemctl). reboot-force bewirkt einen erzwungenen Neustart, der alle Prozesse zwangsweise beendet, aber beim Neustart keine verschmutzten Dateisysteme verursachen sollte (dh äquivalent zu systemctl reboot -f), und ein sofortiger Neustart führt zur sofortigen Ausführung des Systemaufrufs reboot (2), was zur Folge haben kann bei Datenverlust. Der Standardwert ist none.

2
mcv

Sie können OnFailure festlegen, um einen anderen Dienst zu starten, 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 zum Einrichten finden Sie unter Systemd-Statusmail bei Geräteausfall und ändern Sie es, um stattdessen den Dienst neu zu starten.

1
laktak