Hinweis: Ich habe einen Artikel über Medium geschrieben, in dem erläutert wird, wie ein Dienst erstellt und dieses spezielle Problem vermieden wird : Erstellen eines Linux-Dienstes mit systemd .
Ursprüngliche Frage:
Ich verwende systemd, um ein Arbeitsskript immer am Laufen zu halten:
[Unit]
Description=My worker
After=mysqld.service
[Service]
Type=simple
Restart=always
ExecStart=/path/to/script
[Install]
WantedBy=multi-user.target
Obwohl der Neustart problemlos funktioniert, wenn das Skript nach einigen Minuten normal beendet wird, habe ich festgestellt, dass der systemd
Versuch, es zu starten , einfach aufgegeben wird , 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 Arbeitsskript mehrmals mit dem Beendigungsstatus "" fehlschlägt 255
, systemd
wird der Versuch, es neu zu starten, abgebrochen:
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 zu zwingen systemd
zu immer nach ein paar Sekunden noch einmal versuchen?
StartLimitIntervalSec=0
und voilà.Ja , das gibt es. Sie können festlegen, dass der Versuch nach
x
Sekunden wiederholt werden[Service]
soll.Nach dem Speichern der Datei müssen Sie die Daemon-Konfigurationen neu laden, um sicherzustellen,
systemd
dass die neue Datei bekannt ist.Starten Sie dann den Dienst neu, um die Änderungen zu aktivieren.
Wie Sie angefordert haben, in der Dokumentation suchen,
klingt nach einer anständigen Empfehlung.
quelle
RestartSec
Direktivesystemd
mehrere Neustarts sehr schnell versucht und gehen dann in einen permanenten Fehlerzustand über. etwas, das nicht passieren kann , wennRestartSec
angegeben ist?always
ist eine Obermenge vonon-failure
, also wird es nicht helfen!Nein. Systemd gibt den Versuch auf, es für eine Weile neu zu starten . Dies wird in dem von Ihnen angegebenen Protokoll deutlich angezeigt:
Dies ist eine Geschwindigkeitsbegrenzung.
Die Dauer der kurzen Wartezeit wird in der Serviceeinheit mit der
StartLimitIntervalSec=
Einstellung festgelegt. Die Anzahl der Starts, die innerhalb dieses Intervalls benötigt werden, um den Ratenbegrenzungsmechanismus auszulösen, wird über dieStartLimitBurst=
Einstellung festgelegt. Wenn sich auf Ihrem System nichts von Vanilla System D unterscheidet, einschließlich der Standardeinstellungen für diese beiden Einstellungen, ist dies innerhalb von 10 Sekunden fünfmal der Fall.StartLimitIntervalSec=0
Deaktiviert die Ratenbegrenzung, sodass systemd immer wieder versucht, anstatt aufzugeben. Es ist jedoch besser, Ihren Dienst entweder nicht so oft beenden zu lassen oder zwischen dem Beenden und dem Neustart so lange inaktiv zu lassen, bis der Grenzwert für die Übertragungsrate nicht überschritten wird.Beachten Sie, dass es für die Geschwindigkeitsbegrenzung unerheblich ist, wie Ihr Dienst beendet wurde. Es wird unabhängig von der Ursache die Anzahl der Versuche ausgelöst, es zu starten / neu zu starten.
Weitere Lektüre
systemd.unit
. systemd manpages. freedesktop.org.quelle
StartLimitIntervalSec=10
undStartLimitIntervalSec=5
ohne Glück einzustellen.StartLimitIntervalSec=0
.