Come modificare il valore di timeout del servizio systemd?


33

Nella società in cui lavoro ora esiste un servizio legacy e il suo script init utilizza SysvInit precedente, ma funziona su systemd (CentOS 7).

Poiché esiste un sacco di calcoli, questo servizio richiede circa 70 secondi per terminare. Non ho configurato alcun timeout per systemd e non ho modificato le configurazioni predefinite in /etc/systemd/system.conf, ma comunque quando eseguo il service SERVICE stopmio servizio è scaduto dopo 60 secondi.

Controllando journalctl -b -u SERVICE.servicetrovo questo registro:

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]

Ho già provato a cambiare la DefaultTimeoutStopSecproprietà situata /etc/systemd/system.confa 90s, ma il timeout accade ancora.

Qualcuno ha idea del perché è il timeout a 60 anni? C'è altrove che questo valore di timeout è configurato? C'è un modo per verificarlo?

Questo servizio funziona con Java 7 e per demonizzarlo, usa JSVC . Ho configurato il -waitparametro con il valore 120.

Risposte:


55

Il mio servizio systemd ha continuato a scadere a causa del tempo necessario per l'avvio, quindi questo ha risolto il problema per me:

  1. Modifica il tuo file systemd:
    • Per le versioni moderne disystemd : Esegui systemctl edit --full node.service( sostituire "nodo" con il nome del servizio ).
      • Questo creerà un file di sistema /etc/systemd/system/node.service.d/che sovrascriverà il file di sistema in /usr/lib/systemd/system/node.service. Questo è il modo corretto di configurare i file di sistema. Maggiori informazioni su come usare systemctl editsono qui .
    • Modifica diretta del file di sistema : il file di sistema per me è disponibile /usr/lib/systemd/system/node.service. Sostituisci "nodo" con il nome dell'applicazione. Tuttavia, non è sicuro modificare direttamente i file in /usr/lib/systemd/(Vedi commenti)
  2. Usare TimeoutStartSec, TimeoutStopSeco TimeoutSec(maggiori info qui ) per specificare per quanto tempo il timeout dovrebbe essere per iniziare e interrompere il processo. Successivamente, ecco come appariva il mio file systemd:

    [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
    
    • È inoltre possibile visualizzare lo stato di Timeout corrente eseguendo uno di questi (ma è necessario modificare il servizio per apportare modifiche. Vedere il passaggio 1):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. Successivamente dovrai ricaricare il systemd con systemctl reload node.service
  4. Ora prova a iniziare il tuo servizio con systemctl start node.service
  5. Se non ha funzionato , prova a riavviare systemctl consystemctl reboot
  6. Se questo non ha funzionato , provare a utilizzare l' --no-blockopzione per la systemctl in questo modo: systemctl --no-block start node.service. Questa opzione è descritta qui : "Non attendere in modo sincrono il completamento dell'operazione richiesta. Se non viene specificato, il lavoro verrà verificato, accodato e systemctl attenderà fino al completamento dell'avvio dell'unità. Passando questo argomento, viene verificato e accodato. "
    • C'è anche l'opzione da usare al systemctl maskposto di systemctl start. Per maggiori informazioni vedi qui .

Aggiornamenti dai commenti:

  • TimeoutSec=infinity: Invece di usare "infinito" qui, dedica molto tempo, ad esempio TimeoutSec=900(15 min). Se l'applicazione impiega "per sempre" per uscire, è possibile che blocchi un riavvio indefinitamente. Credit @Alexis Wilke e @JCCyC
  • Invece di modificare /usr/lib/systemd/system, prova systemctl editinvece o modifica /etc/systemd/systemper sovrascriverli. Non modificare mai i file di servizio in /usr/lib/. Credito @ryeager e @ 0xC0000022L

8
TimeoutSec=infinity- Non sarebbe possibile che questo blocco si riavvii indefinitamente? E se ci volesse "per sempre" per terminare quel processo? Suggerirei una grande quantità, tipo 5min, ma probabilmente non infinity...
Alexis Wilke,

6
non dovresti modificare i file di servizio in / usr / lib, dovresti modificarli o sovrascriverli in / etc / systemd / system
ryeager

5
Mentre l'essenza del consiglio è valida, devo concordare con @ryeager ... versioni moderne systemddell'offerta systemctl edit(e maskdisabilitarle con forza bruta, al contrario di disable) proprio per quello scopo. Non dovresti mai modificare i file in /usr/lib/systemd.
0xC0000022L

3
TimeoutSec=infinitynon ha funzionato qui, ho usato TimeOutSec=900(15 min) e questo mi ha salvato il posteriore. - Ho dovuto eseguire in systemctl daemon-reloadseguito, prima di riavviare il servizio.
JCCyC

10

In esecuzione systemctl show SERVICE_NAME.service -p TimeoutStopUSecpotrei almeno vedere il timeout impostato da systemd al mio servizio.

Ho cambiato lo script in un normale file unitario per farlo funzionare correttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.