¿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.

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.