¿Cómo cambiar el valor de tiempo de espera del servicio systemd?

33

En la compañía en la que estoy trabajando ahora hay un servicio heredado y su script de inicio está usando SysvInit antiguo, pero se está ejecutando sobre systemd (CentOS 7).

Debido a que hay muchos cálculos, este servicio tarda unos 70 segundos en finalizar. No configuré ningún tiempo de espera para systemd, y no cambié las configuraciones predeterminadas en /etc/systemd/system.conf, pero aún así cuando ejecuto service SERVICE stopmi servicio se agota el tiempo de espera después de 60 segundos.

Comprobando con journalctl -b -u SERVICE.serviceencuentro este 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]

Ya intenté cambiar la DefaultTimeoutStopSecpropiedad en /etc/systemd/system.confa 90s, pero el tiempo de espera aún ocurre.

¿Alguien tiene alguna idea de por qué se está agotando el tiempo a los 60? ¿Hay algún otro lugar donde este valor de tiempo de espera esté configurado? ¿Hay alguna manera de verificarlo?

Este servicio se ejecuta con Java 7 y para demonizarlo, utiliza JSVC . Configuré el -waitparámetro con el valor 120.

César Ralf
fuente

Respuestas:

55

Mi servicio systemd seguía agotando debido al tiempo que me llevaría arrancar también, así que esto me lo solucionó:

  1. Edite su archivo systemd:
    • Para versiones modernas desystemd : Ejecutar systemctl edit --full node.service( reemplace "nodo" con su nombre de servicio ).
      • Esto creará un archivo del sistema /etc/systemd/system/node.service.d/que anulará el archivo del sistema en /usr/lib/systemd/system/node.service. Esta es la forma correcta de configurar los archivos de su sistema. Más información sobre cómo usar systemctl editestá aquí .
    • Edición directa del archivo del sistema : el archivo del sistema para mí está en /usr/lib/systemd/system/node.service. Reemplace "nodo" con el nombre de su aplicación. Sin embargo, no es seguro editar archivos directamente en /usr/lib/systemd/(Ver comentarios)
  2. Use TimeoutStartSec, TimeoutStopSeco TimeoutSec(más información aquí ) para especificar cuánto tiempo debe ser el tiempo de espera para iniciar y detener el proceso. Luego, así es como se veía mi archivo 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
    
    • También puede ver el estado actual del tiempo de espera ejecutando cualquiera de estos (¡pero tendrá que editar su servicio para realizar cambios! Vea el paso 1):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. A continuación, deberá volver a cargar el systemd con systemctl reload node.service
  4. Ahora intenta comenzar tu servicio con systemctl start node.service
  5. Si eso no funcionó , intente reiniciar systemctl consystemctl reboot
  6. Si eso no funcionaba , intente utilizar la --no-blockopción para systemctl este modo: systemctl --no-block start node.service. Esta opción se describe aquí : "No espere sincrónicamente a que finalice la operación solicitada. Si no se especifica esto, el trabajo se verificará, se pondrá en cola y systemctl esperará hasta que se complete el arranque de la unidad. Al pasar este argumento, solo está verificado y en cola ".
    • También existe la opción de usar en systemctl masklugar de systemctl start. Para más información ver aquí .

Actualizaciones de comentarios:

  • TimeoutSec=infinity: En lugar de usar "infinito" aquí, dedica una gran cantidad de tiempo, como TimeoutSec=900(15 min). Si la aplicación tarda "para siempre" en salir, entonces es posible que bloquee un reinicio indefinidamente. Crédito @Alexis Wilke y @JCCyC
  • En lugar de editar /usr/lib/systemd/system, intente en su systemctl editlugar o edite /etc/systemd/systempara anularlos. Nunca debe editar archivos de servicio en /usr/lib/. Crédito @ryeager y @ 0xC0000022L
Katie
fuente
8
TimeoutSec=infinity- ¿No sería posible que esto bloqueara un reinicio indefinidamente? ¿Qué pasa si toma "para siempre" para que ese proceso salga? Sugeriría una gran cantidad, como 5min, pero probablemente no infinity...
Alexis Wilke
66
no debería editar archivos de servicio en / usr / lib, debería editarlos o anularlos en / etc / systemd / system
ryeager
55
Si bien la esencia del consejo es sólida, tengo que estar de acuerdo con @ryeager ... versiones modernas de la systemdoferta systemctl edit(y maskdeshabilitarlas con fuerza bruta, en lugar de disable) para ese mismo propósito. Nunca debe editar los archivos en /usr/lib/systemd.
0xC0000022L
3
TimeoutSec=infinityno funcionó aquí, usé TimeOutSec=900(15 min) y eso salvó mi posterior. - Tenía que correr systemctl daemon-reloaddespués, antes de reiniciar el servicio.
JCCyC
10

En ejecución systemctl show SERVICE_NAME.service -p TimeoutStopUSec, al menos pude ver el tiempo de espera establecido por systemd para mi servicio.

Cambié el script a un archivo de unidad normal para que funcione correctamente.

César Ralf
fuente