systemd service automatyczny restart po StartLimitInterval

33

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ę.

Dinesh PR
źródło
3
Napisałem artykuł, który wyjaśnia, jak utworzyć usługę i jak uniknąć tego konkretnego problemu: Tworzenie usługi Linux za pomocą systemd .
Benjamin
2
Myślę, że szukasz StartLimitIntervalSec, nie StartLimitInterval.
Marc Tamsky

Odpowiedzi:

30

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:

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

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.

krzyk
źródło
To powinno być oznaczone jako zaakceptowana odpowiedź ...
Jeff
nie mogę znaleźć StartLimitInterval=dyrektywy w moim najnowszym ubuntu 18 ...
wick,
10

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.

Youssef Eldakar
źródło
Jak zauważyłeś, jest to bardziej komentarz niż odpowiedź.
Dave M
dokładnie to, czego potrzebowałem, ty
Some Linux Nerd
Czy zgodnie z dokumentacją, którą dowiązałeś, nie powinno to być StartLimitIntervalSec=(i DefaultStartLimitIntervalSec=)? Zwróć uwagę na dodanie Secobu nazw parametrów.
Doktor J
6

Kilka lat później i przy systemd 232 nie działa już tak, jak opisano w pytaniu i odpowiedziach z 2016 r. Nazwa opcji StartLimitIntervalSeci sekcje uległy zmianie. Teraz musi wyglądać tak:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

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.

Ingo
źródło
1
Wygląda na to, że StartLimitIntervaljest nadal obsługiwany, jeśli nieudokumentowany, w Servicesekcji. Ale nowy, preferowany StartLimitIntervalSecdziała tylko w Unit.
Danek Duvall
1

Możesz ustawić OnFailureuruchamianie 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ę.

laktak
źródło
1

Możesz użyć StartLimitAction=reboot. Spowoduje to ponowne uruchomienie systemu po StartLimitInterval.

StartLimitAction = Skonfiguruj działanie, które ma być wykonane, jeśli zostanie przekroczony limit prędkości skonfigurowany za pomocą StartLimitInterval = i StartLimitBurst =. Wykonuje jedną z opcji none, restart, force-restart lub restart natychmiastowy. Jeśli nie zostanie ustawiony żaden, naciśnięcie limitu prędkości nie spowoduje żadnych działań poza tym, że start nie będzie dozwolony. restart powoduje ponowne uruchomienie po normalnej procedurze zamykania (tj. równoważne z restartem systemctl). reboot-force powoduje wymuszone ponowne uruchomienie, które spowoduje wymuszone zakończenie wszystkich procesów, ale nie powinno powodować brudnych systemów plików podczas restartu (tj. odpowiednik restartu systemctl -f), a natychmiastowy restart powoduje natychmiastowe wykonanie wywołania systemowego restartu (2), co może spowodować w utracie danych. Domyślnie brak.

Mcv
źródło