Chcę, aby moja usługa systemowa była automatycznie restartowana po awarii. Dodatkowo chcę ocenić limit restartów. Chcę zezwolić na maksymalnie 3 restarty w ciągu 90 sekund. Dlatego wykonałem następującą konfigurację.
[Usługa]
Uruchom ponownie = zawsze
StartLimitInterval = 90
StartLimitBurst = 3
Teraz usługa jest restartowana po awarii. Po 3 szybkich błędach / restartach nie uruchamia się ponownie zgodnie z oczekiwaniami. Teraz spodziewałem się, że systemd uruchomi usługę po upływie limitu czasu (StartLimitInterval). Ale systemd nie uruchamia automatycznie usługi po upływie limitu czasu (90 sekund), jeśli ręcznie zrestartuję usługę po upływie limitu czasu. Ale chcę, aby systemd automatycznie uruchomił usługę po StartLimitInterval. Daj mi znać, jak osiągnąć tę funkcję.
StartLimitIntervalSec
, nieStartLimitInterval
.Odpowiedzi:
Aby usługa uruchomiła się ponownie 3 razy w 90-sekundowych odstępach czasu, w pliku usługi systemd należy umieścić następujące wiersze:
To zadziałało dla mnie dla usługi, która uruchamia skrypt za pomocą „Type = idle”. Pamiętaj, że „StartLimitInterval” musi być większy niż „RestartSec * StartLimitBurst”, w przeciwnym razie usługa zostanie uruchomiona ponownie na czas nieokreślony.
Zajęło mi trochę czasu z próbami i błędami, aby zrozumieć, w jaki sposób systemd korzysta z tych opcji, co sugeruje, że systemd nie jest tak dobrze udokumentowany, jak można by się spodziewać. Te opcje skutecznie zapewniają czas ponownej próby i maksymalną liczbę prób, których szukałem.
źródło
StartLimitInterval=
dyrektywy w moim najnowszym ubuntu 18 ...Opisane zachowanie jest zgodne z dokumentacją:
StartLimitInterval =, StartLimitBurst = Skonfiguruj ograniczenie szybkości uruchamiania usługi. Domyślnie usługi, które są uruchamiane więcej niż 5 razy w ciągu 10 sekund, nie mogą być uruchamiane więcej razy, aż do upływu 10 sekund. Za pomocą tych dwóch opcji można ograniczyć to ograniczenie prędkości. Użyj StartLimitInterval =, aby skonfigurować interwał sprawdzania (domyślnie DefaultStartLimitInterval = w pliku konfiguracyjnym menedżera, ustaw na 0, aby wyłączyć ograniczenie prędkości). Użyj StartLimitBurst =, aby skonfigurować liczbę dozwolonych startów na interwał (domyślnie DefaultStartLimitBurst = w pliku konfiguracyjnym menedżera). Te opcje konfiguracji są szczególnie przydatne w połączeniu z Restart =; mają one jednak zastosowanie do wszystkich rodzajów rozruchów (w tym ręcznych), nie tylko tych uruchamianych przez logikę Restart =.Zauważ, że jednostki, które są skonfigurowane dla Restart = i które osiągną limit początkowy, nie są już próbowane ponownie; mogą jednak zostać ponownie uruchomione ręcznie w późniejszym momencie, od tego momentu logika ponownego uruchamiania jest ponownie aktywowana. Zauważ, że błąd systemctl reset-failed spowoduje opróżnienie licznika częstotliwości restartu dla usługi, co jest przydatne, jeśli administrator chce ręcznie uruchomić usługę, a limit startu to zakłóca.
Wciąż próbuję wymyślić sposób na osiągnięcie pożądanego zachowania.
źródło
StartLimitIntervalSec=
(iDefaultStartLimitIntervalSec=
)? Zwróć uwagę na dodanieSec
obu nazw parametrów.Kilka lat później i przy systemd 232 nie działa już tak, jak opisano w pytaniu i odpowiedziach z 2016 r. Nazwa opcji
StartLimitIntervalSec
i sekcje uległy zmianie. Teraz musi wyglądać tak:Spowoduje to 5 restartów w ciągu 30 sekund (5 * 6) plus jeden restart w 33 sekund. Mamy więc 6 restartów w 33 sek. Przekracza to limit 5 ponownych uruchomień w 33 sek. Ponowne uruchomienie zatrzyma się po 5 zliczeniach po około 31 sekundach.
źródło
StartLimitInterval
jest nadal obsługiwany, jeśli nieudokumentowany, wService
sekcji. Ale nowy, preferowanyStartLimitIntervalSec
działa tylko wUnit
.Możesz ustawić
OnFailure
uruchamianie innej usługi, gdy to się nie powiedzie. W usłudze awaryjnej można uruchomić skrypt, który czeka, a następnie ponownie uruchamia usługę.Aby dowiedzieć się, jak to skonfigurować, zobacz Poczta statusu Systemd w przypadku awarii urządzenia i zmodyfikuj go, aby zamiast tego ponownie uruchomić usługę.
źródło
Możesz użyć
StartLimitAction=reboot
. Spowoduje to ponowne uruchomienie systemu po StartLimitInterval.źródło