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

33

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

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

Verificando com journalctl -b -u SERVICE.serviceeu acho 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]

Eu já tentei alterar a DefaultTimeoutStopSecpropriedade em /etc/systemd/system.confpara 90s, mas o tempo limite ainda acontece.

Alguém tem alguma idéia de por que o tempo limite chega aos 60 anos? Existe algum outro lugar em que esse valor de tempo limite esteja configurado? Existe uma maneira de verificar isso?

Este serviço é executado com o java 7 e, para daemonizá-lo, ele usa JSVC . Eu configurado o -waitparâmetro com o valor 120.

Caesar Ralf
fonte

Respostas:

54

Meu serviço systemd continuava atingindo o tempo limite por causa de quanto tempo levaria para inicializar também, então isso o corrigiu para mim:

  1. Edite seu arquivo systemd:
    • Para versões modernas desystemd : Execute systemctl edit --full node.service( substitua "nó" pelo seu nome de serviço ).
      • Isso criará um arquivo de sistema /etc/systemd/system/node.service.d/que substituirá o arquivo de sistema em /usr/lib/systemd/system/node.service. Essa é a maneira correta de configurar os arquivos do sistema. Mais informações sobre como usar systemctl editestão aqui .
    • Edição direta do arquivo do sistema : O arquivo do sistema para mim está em /usr/lib/systemd/system/node.service. Substitua "node" pelo nome do seu aplicativo. No entanto, não é seguro editar arquivos diretamente /usr/lib/systemd/(ver comentários)
  2. Use TimeoutStartSec, TimeoutStopSecou TimeoutSec(mais informações aqui ) para especificar quanto tempo deve ser o tempo limite para iniciar e parar o processo. Depois, é assim que meu arquivo systemd fica:

    [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
    
    • Você também pode visualizar o status atual do Tempo limite executando qualquer uma dessas opções (mas precisará editar seu serviço para fazer alterações! Consulte a etapa 1):
      • 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 systemd com systemctl reload node.service
  4. Agora tente iniciar seu serviço com systemctl start node.service
  5. Se isso não funcionar , tente reiniciar o systemctl comsystemctl reboot
  6. Se isso não funcionou , tente usar a --no-blockopção para systemctl assim: systemctl --no-block start node.service. Esta opção é descrita aqui : "Não espere de forma síncrona a operação solicitada terminar. Se isso não for especificado, o trabalho será verificado, enfileirado e o systemctl esperará até que a inicialização da unidade seja concluída. Ao passar esse argumento, ele é verificado e enfileirado ".
    • Também há a opção de usar em systemctl maskvez de systemctl start. Para mais informações, clique aqui .

Atualizações dos comentários:

  • TimeoutSec=infinity: Em vez de usar o "infinito" aqui, dedique bastante tempo, como TimeoutSec=900(15 min). Se o aplicativo demorar "para sempre" para sair, é possível que ele bloqueie uma reinicialização indefinidamente. Crédito @Alexis Wilke e @JCCyC
  • Em vez de editar /usr/lib/systemd/system, tente systemctl editou edite /etc/systemd/systempara substituí-los. Você nunca deve editar arquivos de serviço /usr/lib/. Crédito @ryeager e @ 0xC0000022L
Katie
fonte
8
TimeoutSec=infinity- não seria possível que isso bloqueie uma reinicialização indefinidamente? E se demorar "para sempre" para que esse processo saia? Eu sugeriria uma grande quantidade, tipo 5min, mas provavelmente não infinity...
Alexis Wilke
6
você não deve ser a edição de arquivos de serviços em / usr / lib, você deve editá-los ou substituí-los em / etc / systemd / system
ryeager
5
Embora a essência do conselho seja sólida, eu tenho que concordar com o @ryeager ... versões modernas da systemdoferta systemctl edit(e maskdesativá-las com força bruta, em oposição a disable) para esse mesmo objetivo. Você nunca deve editar os arquivos /usr/lib/systemd.
0xC0000022L
3
TimeoutSec=infinitynão funcionou aqui, usei TimeOutSec=900(15 min) e isso salvou meu traseiro. - Eu precisava executar systemctl daemon-reloaddepois, antes de reiniciar o serviço.
JCCyC #
10

Em execução systemctl show SERVICE_NAME.service -p TimeoutStopUSec, pude ver pelo menos o tempo limite definido pelo systemd para o meu serviço.

Mudei o script para um arquivo de unidade normal, um para que funcione corretamente.

Caesar Ralf
fonte