Dodanie opóźnienia między zatrzymaniem a rozpoczęciem procesu w systemd

10

Mam naprawdę dziwny problem systemd. Kiedy wydam systemctl restart, rozpocznie nowy proces przed zakończeniem poprzedniego.

Można to zobaczyć w dzienniku, w którym końcowy komunikat zamknięcia („dziennik zamknięcia”) jest rejestrowany po komunikacie startowym („dziennik otwarcia”).

Czy jest jakiś sposób na dodanie opóźnienia między zatrzymaniem a rozpoczęciem procesu?

Šimon Tóth
źródło
Nic nie powstrzyma cię przed bieganiemsystemctl stop myservice && sleep 3 && systemctl start myservice
don_crissti
Dlaczego to jest dziwne? Jest to funkcja projektowa, która pozwala zostawić cię w spokoju, aby omijać rzeczywiste problemy. Wstaw tryb uśpienia w urządzeniu Uruchom lub użyj warunku ExecPre, aby upewnić się, że stare wystąpienie zostało całkowicie usunięte.
Florian Heigl,

Odpowiedzi:

13

W plikach usług systemowych możesz ustawić opcję RestartSec, aby dodać opóźnienie do ponownego uruchomienia. Zobacz przykład poniżej:

[Service]
Restart=always
RestartSec=30

Sprawdź ten link, aby uzyskać więcej przykładów.

mmohammad
źródło
1
afaik RestartSecdotyczy tylko usług skonfigurowanych zgodnie z Restart=dyrektywą i nie jest brany pod uwagę przy wykonywaniusystemctl restart someservice
don_crissti
1

RestartSec wydaje się być używany tylko wtedy, gdy ta konkretna usługa jest restartowana za pomocą komendy systemctl restart.

Na przykład mam dwie usługi, A i B.

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

i

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

Jeśli wykonasz restart systemctl B, zadziała zgodnie z oczekiwaniami ... ale jeśli wykonasz restart systemctl A, obie usługi zostaną zatrzymane i natychmiast ponownie uruchomione, bez opóźnienia.

Systemd najwyraźniej używa tylko wartości konfiguracyjnych dla jednej określonej usługi i ignoruje je dla jakichkolwiek zależności.

To nie jest tak rzadkie, jak się wydaje. Jeśli B rozmawia ze zdalnym serwerem, szybkie uruchamianie i zatrzymywanie może się nie powieść z powodu odrzucenia klienta przez zdalny koniec. Ale ponowne uruchomienie A nastąpi bezpośrednio, gdy A zostanie zaktualizowane bez zmiany na B.

Prawdopodobnie możesz obejść ten problem, dodając opóźnienie również do A, ale nie powinieneś tego POTRZEBOWAĆ, ponieważ przerywa izolację obiektu, informując A o B, gdy nie jest to zależność.

Dread Quixadhal
źródło