it-swarm.com.de

Systemd Restart = wird immer nicht berücksichtigt

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

Ursprüngliche Frage:


Ich verwende systemd, damit ein Arbeiterskript immer funktioniert:

[Unit]
Description=My worker
After=mysqld.service

[Service]
Type=simple
Restart=always
ExecStart=/path/to/script

[Install]
WantedBy=multi-user.target

Obwohl der Neustart einwandfrei funktioniert, wenn das Skript nach einigen Minuten normal beendet wird, habe ich festgestellt, dass systemd den Versuch, es zu starten, einfach aufgibt, wenn es beim Start wiederholt nicht ausgeführt wird:

Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.

Wenn mein Worker-Skript mehrmals mit dem Exit-Status 255 Fehlschlägt, gibt systemd den Versuch auf, es neu zu starten:

Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.  
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.

Gibt es eine Möglichkeit, systemd zu zwingen, immer nach einigen Sekunden erneut zu versuchen?

62
Benjamin

Ich möchte Rahuls Antwort etwas erweitern.

SystemD versucht mehrmals neu zu starten (StartLimitBurst) und beendet den Versuch, wenn die Anzahl der Versuche innerhalb von StartLimitIntervalSec erreicht ist. Beide Optionen gehören zum Abschnitt [unit].

Die Standardverzögerung zwischen den Ausführungen beträgt 100 ms ( RestartSec ), wodurch das Ratenlimit sehr schnell erreicht wird.

SystemD versucht niemals mehr automatische Neustarts für Einheiten mit Neustartrichtlinie definiert :

Beachten Sie, dass Einheiten, die für Restart= Konfiguriert sind und das Startlimit erreichen, nicht mehr neu gestartet werden sollen. Sie können jedoch zu einem späteren Zeitpunkt noch manuell neu gestartet werden. Ab diesem Zeitpunkt wird die Neustartlogik erneut aktiviert.

Rahuls Antwort hilft, weil die längere Verzögerung verhindert, dass der Fehlerzähler innerhalb der StartLimitIntervalSec Zeit erreicht wird. Die richtige Antwort ist jedoch, sowohl RestartSec als auch StartLimitBurst auf vernünftige Werte zu setzen.

62
MarSik

Ja gibt es. Sie können angeben, dass nach x Sekunden unter [Service] Sektion,

[Service]
Type=simple
Restart=always
RestartSec=3
ExecStart=/path/to/script

Nach dem Speichern der Datei müssen Sie die Dämonkonfigurationen neu laden, um sicherzustellen, dass systemd die neue Datei kennt.

systemctl daemon-reload

starten Sie dann den Dienst neu, um Änderungen zu aktivieren.

systemctl restart test

Wie Sie angefordert haben, sehen Sie sich die Dokumentation an.

Restart=on-failure

klingt nach einer anständigen Empfehlung.

41
Rahul

systemd gibt den Versuch auf, es neu zu starten

Nein. Systemd gibt den Versuch auf, es neu zu starten für eine Weile. Dies wird in dem von Ihnen angegebenen Protokoll deutlich angezeigt:

14. Juni 11:25:51 localhost systemd [1]: test.service:  Fehler mit Ergebnis 'Startlimit' .

Dies ist eine Geschwindigkeitsbegrenzung.

Die Länge der kurzen Zeit wird in der Serviceeinheit mit der Einstellung StartLimitIntervalSec= Angegeben. Die Anzahl der Starts, die innerhalb dieses Intervalls benötigt werden, um den Ratenbegrenzungsmechanismus auszulösen, wird über die Einstellung StartLimitBurst= Angegeben. Wenn sich auf Ihrem System nichts von Vanilla systemd unterscheidet, einschließlich der Standardeinstellungen für diese beiden Einstellungen, erfolgt dies innerhalb von 10 Sekunden fünfmal.

StartLimitIntervalSec=0 Deaktiviert die Ratenbegrenzung, sodass systemd es für immer wiederholt, anstatt aufzugeben. Es ist jedoch ein besserer Ansatz, Ihren Dienst entweder nicht so oft zu beenden oder zwischen dem Beenden und Neustarten so untätig zu lassen, dass der Schwellenwert für die Ratenbegrenzung nicht überschritten wird.

Beachten Sie, dass es der Ratenbegrenzung egal ist, wie Ihr Dienst beendet wurde. Es löst die Anzahl der Versuche aus, es zu starten/neu zu starten, unabhängig von ihrer Ursache.

Weiterführende Literatur

5
JdeBP