Systemd Restart = sempre não é honrado

41

Observação: escrevi um artigo no Medium que explica como criar um serviço e como evitar esse problema específico: Criando um serviço Linux com o systemd .

Pergunta original:

Estou usando o systemd para manter um script de trabalho funcionando em todos os momentos:

[Unit]
Description=My worker
After=mysqld.service

[Service]
Type=simple
Restart=always
ExecStart=/path/to/script

[Install]
WantedBy=multi-user.target

Embora a reinicialização funcione bem se o script sair normalmente após alguns minutos, notei que se ele falhar repetidamente na inicialização, systemd desistirá de tentar iniciá-lo:

Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.

Da mesma forma, se meu script de trabalho falhar várias vezes com um status de saída de 255 , systemd desistirá de tentar reiniciá-lo:

Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.  
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.

Existe uma maneira de forçar systemd a sempre tentar novamente após alguns segundos?

    
por Benjamin 14.06.2016 / 11:21

3 respostas

39

Eu gostaria de estender um pouco a resposta de Rahul.

O SystemD tenta reiniciar várias vezes ( StartLimitBurst ) e pára de tentar se a contagem de tentativas for atingida em StartLimitIntervalSec . Ambas as opções pertencem à seção [unit] .

O atraso padrão entre as execuções é de 100 ms ( RestartSec ) que faz com que o limite de taxa seja atingido muito rapidamente.

O SystemD não tentará mais reinicializações automáticas para unidades com política de reinicialização definida :

Note that units which are configured for Restart= and which reach the start limit are not attempted to be restarted anymore; however, they may still be restarted manually at a later point, from which point on, the restart logic is again activated.

A resposta de Rahul ajuda, porque o atraso mais longo evita atingir o contador de erros dentro do StartLimitIntervalSec time. A resposta correta é definir os valores RestartSec e StartLimitBurst para valores razoáveis.

    
por 18.11.2016 / 15:15
22

Sim , existe. Você pode especificar a repetição após x segundos na seção [Service] ,

[Service]
Type=simple
Restart=always
RestartSec=3
ExecStart=/path/to/script

Depois de salvar o arquivo, é necessário recarregar as configurações do daemon para garantir que systemd esteja ciente do novo arquivo,

systemctl daemon-reload

, em seguida, reinicie o serviço para ativar as alterações,

systemctl restart test

Como você solicitou, olhando a documentação,

Restart=on-failure

parece uma recomendação decente.

    
por 14.06.2016 / 11:40
3

systemd gives up trying to restart it

Não. O systemd desiste de tentar reiniciá-lo por um tempo . Isso é mostrado claramente no log que você fornece:

Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.

Isso é uma limitação de taxa.

O comprimento do pequeno tempo é especificado na unidade de serviço, usando a configuração StartLimitIntervalSec= . O número de inicializações necessárias nesse intervalo para acionar o mecanismo de limitação de taxa é especificado por meio da configuração StartLimitBurst= . Se nada no seu sistema for diferente do padrão do vanilla, incluindo os padrões para essas duas configurações, então ele será 5 vezes em 10 segundos.

StartLimitIntervalSec=0 desativa a limitação de taxa. Mas fazer com que seu serviço não saia com tanta frequência ou ocioso o suficiente entre as saídas e reinicie que ele não exceda o limite de limitação de taxa é uma abordagem melhor.

Observe que a limitação de taxa não se importa com a saída do seu serviço. Aciona o número de tentativas de iniciar / reiniciar, independentemente de sua causa.

Leitura adicional

por 14.06.2016 / 22:48

Tags