Jak zmienić wartość limitu czasu usługi systemowej?

33

W firmie, w której teraz pracuję, jest starsza usługa, a jej skrypt inicjujący używa starego SysvInit, ale działa na systemd (CentOS 7).

Ponieważ jest dużo obliczeń, zakończenie usługi zajmuje około 70 sekund. Nie skonfigurowałem żadnego limitu czasu dla systemd i nie zmieniłem domyślnych konfiguracji o /etc/systemd/system.conf, ale mimo to po uruchomieniu service SERVICE stopmojej usługi upływa limit czasu po 60 sekundach.

Sprawdzam za pomocą journalctl -b -u SERVICE.servicetego dziennika:

Sep 02 11:27:46 service.hostname systemd[1]: Stopping LSB: Start/Stop
Sep 02 11:28:46 service.hostname SERVICE[24151]: Stopping service: Error code: 255
Sep 02 11:28:46 service.hostname SERVICE[24151]: [FAILED]

Próbowałem już zmiany DefaultTimeoutStopSecwłasności w /etc/systemd/system.confcelu 90s, ale limit czasu nadal się dzieje.

Czy ktoś ma pojęcie, dlaczego upływa limit czasu w latach 60.? Czy jest gdzieś skonfigurowana ta wartość limitu czasu? Czy mogę to sprawdzić?

Ta usługa działa z java 7 i do demonizacji korzysta z JSVC . Skonfigurowałem -waitparametr z wartością 120.

Cezar Ralf
źródło

Odpowiedzi:

54

Upłynął limit czasu mojej usługi systemowej ze względu na to, ile czasu zajmie także uruchomienie komputera, więc naprawiłem to dla mnie:

  1. Edytuj plik systemowy:
    • W przypadku nowoczesnych wersjisystemd : Uruchom systemctl edit --full node.service( zamień „node” na nazwę usługi ).
      • Spowoduje to utworzenie pliku systemowego /etc/systemd/system/node.service.d/, który zastąpi plik systemowy o godzinie /usr/lib/systemd/system/node.service. To jest właściwy sposób konfiguracji plików systemowych. Więcej informacji na temat korzystania systemctl editznajduje się tutaj .
    • Bezpośrednie edytowanie pliku systemowego : Plik systemowy jest dla mnie na /usr/lib/systemd/system/node.service. Zamień „node” na nazwę swojej aplikacji. Jednak bezpośrednie edytowanie plików w /usr/lib/systemd/( Bezpieczne) nie jest bezpieczne
  2. Stosowanie TimeoutStartSec, TimeoutStopSeclub TimeoutSec(więcej informacji tutaj ), aby określić, jak długo powinien być czas oczekiwania na rozpoczęcie i zatrzymanie procesu. Potem tak wyglądał mój plik systemowy:

    [Unit]
    Description=MyProject
    Documentation=man:node(1)
    After=rc-local.service
    
    [Service]
    WorkingDirectory=/home/myproject/GUIServer/Server/
    Environment="NODE_PATH=/usr/lib/node_modules"
    ExecStart=-/usr/bin/node Index.js
    Type=simple
    Restart=always
    KillMode=process
    TimeoutSec=900
    
    [Install]
    WantedBy=multi-user.target
    
    • Możesz również wyświetlić bieżący stan limitu czasu, uruchamiając dowolny z nich (ale musisz zmodyfikować usługę, aby wprowadzić zmiany! Zobacz krok 1):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. Następnie musisz ponownie załadować systemd systemctl reload node.service
  4. Teraz spróbuj uruchomić usługę systemctl start node.service
  5. Jeśli to nie zadziała , spróbuj zrestartować systemctl za pomocąsystemctl reboot
  6. Jeśli to nie działa , spróbuj użyć --no-blockopcji dla systemctl tak: systemctl --no-block start node.service. Ta opcja została opisana tutaj : „Nie czekaj synchronicznie na zakończenie żądanej operacji. Jeśli nie zostanie to określone, zadanie zostanie zweryfikowane, umieszczone w kolejce, a systemctl będzie czekać do zakończenia uruchamiania urządzenia. Po przekazaniu tego argumentu jest tylko zweryfikowany i umieszczony w kolejce. ”
    • Istnieje również opcja użycia systemctl maskzamiast systemctl start. Aby uzyskać więcej informacji, zobacz tutaj .

Aktualizacje z komentarzy:

  • TimeoutSec=infinity: Zamiast używać tutaj „nieskończoności”, zamiast tego poświęć dużo czasu, na przykład TimeoutSec=900(15 min). Jeśli aplikacja wyjdzie „na zawsze”, możliwe jest, że zablokuje ponowne uruchomienie na czas nieokreślony. Kredyt @Alexis Wilke i @JCCyC
  • Zamiast edytować /usr/lib/systemd/system, spróbuj systemctl editzamiast tego lub edytuj, /etc/systemd/systemaby je zastąpić. Nigdy nie należy edytować plików serwisowych /usr/lib/. Kredyt @ryeager i @ 0xC0000022L
Katie
źródło
8
TimeoutSec=infinity- czy nie byłoby możliwe, aby ten blok uruchomił się ponownie na czas nieokreślony? Co się stanie, jeśli proces zakończy się na zawsze? Sugerowałbym dużą ilość, jak 5min, ale prawdopodobnie nie infinity...
Alexis Wilke,
6
nie powinieneś edytować plików usług w / usr / lib, powinieneś je edytować lub zastąpić w / etc / systemd / system
ryeager
5
Chociaż sedno porad jest solidne, muszę zgodzić się z @ryeager ... nowoczesnymi wersjami systemdoferty systemctl edit(i maskwyłączyć je brutalną siłą, w przeciwieństwie do disable) w tym właśnie celu. Nigdy nie powinieneś edytować plików /usr/lib/systemd.
0xC0000022L
3
TimeoutSec=infinitynie działało tutaj, użyłem TimeOutSec=900(15 min) i to uratowało mój tyłek. - Musiałem uruchomić systemctl daemon-reloadpóźniej, zanim ponownie uruchomię usługę.
JCCyC
10

Uruchamianie systemctl show SERVICE_NAME.service -p TimeoutStopUSecmogłem przynajmniej zobaczyć zbiór limitu czasu przez Systemd na moje usługi.

Zmieniłem skrypt na zwykły plik jednostkowy, aby działał poprawnie.

Cezar Ralf
źródło