Como alterar o valor do tempo limite de serviço do systemd?

24

Na empresa que estou trabalhando agora, há um serviço legado e seu script de inicialização está usando o antigo SysvInit, mas está executando o systemd (CentOS 7).

Como há muita computação, esse serviço leva cerca de 70 segundos para ser concluído. Não configurei nenhum tempo limite para o systemd e não alterei as configurações padrão em /etc/systemd/system.conf , mas ainda quando executo service SERVICE stop , meu serviço está expirando após 60 segundos.

Verificando com journalctl -b -u SERVICE.service eu encontro este log:

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]

Já tentei alterar a propriedade DefaultTimeoutStopSec em /etc/systemd/system.conf para 90s , mas o tempo limite ainda acontece.

Alguém tem alguma ideia de por que é o tempo limite de 60s? Existe algum outro lugar em que esse valor de tempo limite esteja configurado? Existe uma maneira de verificar isso?

Esse serviço é executado com o java 7 e, para daemonizá-lo, ele usa JSVC . Eu configurei o parâmetro -wait com o valor 120 .

    
por Caesar Ralf 02.09.2015 / 14:22

2 respostas

38

Meu serviço do systemd manteve o tempo limite devido ao tempo que levaria para inicializar também, então isso me corrigiu:

  1. Edite seu arquivo systemd, para mim isso foi /usr/lib/systemd/system/node.service . Substitua "node" pelo nome do seu aplicativo.
  2. Use TimeoutStartSec , TimeoutStopSec ou TimeoutSec (mais informações aqui ) para especificar quanto tempo o tempo limite deve ser para iniciar & parando o processo. Depois, foi assim que meu arquivo systemd apareceu:

    [Unit]
    Description=SimGUI2
    Documentation=man:node(1)
    After=rc-local.service
    
    [Service]
    WorkingDirectory=/home/simulations/GUIServer/Server/
    Environment="NODE_PATH=/usr/lib/node_modules"
    ExecStart=-/usr/bin/node Index.js
    Type=simple
    Restart=always
    KillMode=process
    TimeoutSec=infinity
    
    [Install]
    WantedBy=multi-user.target
    
    • Você também pode ver o status atual do Tempo limite executando qualquer um deles (mas será necessário editar o serviço para fazer alterações. Procure em /usr/lib/systemd/system ):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. Em seguida, você precisará recarregar o sistema da seguinte forma:

    • systemctl reload application.service
    • Para mim, foi assim: systemctl reload node.service
  4. Agora tente iniciar seu serviço!

  5. Se isso não funcionar, tente reinicializar systemctl com systemctl reboot
  6. Se isso não funcionar, tente usar a opção --no-block para systemctl da seguinte forma: systemctl --no-block start node . Esta opção é descrita aqui : "Não aguarde a conclusão da operação solicitada. Se isso não for especificado, o trabalho será verificado, enfileirado e o systemctl aguardará até que a inicialização da unidade seja concluída. Ao passar esse argumento, ele só é verificado e enfileirado. "

Espero que isso tenha ajudado!

    
por 15.04.2016 / 21:35
9

Executando systemctl show SERVICE_NAME.service -p TimeoutStopUSec Eu poderia pelo menos ver o tempo limite definido pelo systemd para o meu serviço.

Eu mudei o script para um arquivo unitário regular para que funcione corretamente.

    
por 02.09.2015 / 18:19