Uwaga: Napisałem artykuł na Medium, który wyjaśnia, jak utworzyć usługę i jak uniknąć tego konkretnego problemu: Tworzenie usługi Linux za pomocą systemd .
Oryginalne pytanie:
Używam systemd, aby skrypt roboczy działał przez cały czas:
[Unit]
Description=My worker
After=mysqld.service
[Service]
Type=simple
Restart=always
ExecStart=/path/to/script
[Install]
WantedBy=multi-user.target
Chociaż restart działa poprawnie, jeśli skrypt zakończy się normalnie po kilku minutach, zauważyłem, że jeśli wielokrotnie nie uruchamia się przy starcie, systemd
po prostu zrezygnuje z próby uruchomienia:
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'.
Podobnie, jeśli mój skrypt roboczy kilkakrotnie zawiedzie ze statusem wyjścia 255
, systemd
rezygnuje z próby jego ponownego uruchomienia:
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'.
Czy istnieje sposób, aby zmusić zawszesystemd
do ponownej próby po kilku sekundach?
StartLimitIntervalSec=0
i voilà.Tak jest. Możesz określić, aby spróbować ponownie po
x
kilku sekundach w[Service]
sekcji,Po zapisaniu pliku należy ponownie załadować konfiguracje demona, aby upewnić się, że
systemd
jest świadomy nowego pliku,następnie uruchom ponownie usługę, aby umożliwić zmiany,
Tak jak prosiłeś, przeglądając dokumentację,
brzmi jak godna rekomendacja.
źródło
RestartSec
dyrektywy,systemd
próby przerwania są bardzo szybko uruchamiane, a następnie przechodzą w stan trwałej awarii; coś, co nie może się zdarzyć, gdyRestartSec
jest określone?always
jest nadzbioremon-failure
, więc to nie pomoże!Nie. Systemd rezygnuje z próby ponownego uruchomienia go na chwilę . Widać to wyraźnie w dostarczonym dzienniku:
To ogranicza tempo wprowadzania.
Długość krótkiego czasu jest określona w jednostce serwisowej, przy użyciu
StartLimitIntervalSec=
ustawienia. Liczba uruchomień potrzebnych w tym przedziale do uruchomienia mechanizmu ograniczania prędkości jest określana za pomocąStartLimitBurst=
ustawienia. Jeśli nic w twoim systemie nie różni się od waniliowego systemd, łącznie z domyślnymi dla tych dwóch ustawień, oznacza to 5 razy w ciągu 10 sekund.StartLimitIntervalSec=0
wyłącza ograniczanie stawek. Ale lepszym podejściem jest sprawienie, aby twoja usługa albo nie wychodziła tak często, albo była wystarczająco bezczynna między wyjściami i restartami, aby nie przekraczała progu ograniczenia prędkości.Pamiętaj, że ograniczanie stawek nie ma znaczenia, jak Twoja usługa została zakończona. Wywołuje liczbę prób uruchomienia / ponownego uruchomienia, niezależnie od ich przyczyny.
Dalsza lektura
systemd.unit
. systemowe strony podręcznika. freedesktop.org.źródło
StartLimitIntervalSec=10
iStartLimitIntervalSec=5
bez powodzenia.StartLimitIntervalSec=0
.