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.
StartLimitIntervalSec
, nichtStartLimitInterval
.Antworten:
Um einen dreimaligen Neustart des Dienstes in Intervallen von 90 Sekunden zu veranlassen, fügen Sie die folgenden Zeilen in Ihre systemd-Dienstdatei ein:
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.
quelle
StartLimitInterval=
Ich kann keine Anweisung in meinem neuesten Ubuntu 18 finden ...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.
quelle
StartLimitIntervalSec=
(undDefaultStartLimitIntervalSec=
) sein? Beachten Sie das Hinzufügen vonSec
zu beiden Parameternamen.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
StartLimitIntervalSec
und Abschnitten geändert haben. Nun muss es so aussehen: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.
quelle
StartLimitInterval
, als ob es in diesemService
Abschnitt immer noch unterstützt wird, wenn es nicht dokumentiert ist . Aber der neue, bevorzugteStartLimitIntervalSec
funktioniert nur inUnit
.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.
quelle
Sie können verwenden
StartLimitAction=reboot
. Dadurch wird das System nach dem StartLimitInterval neu gestartet.quelle