Nota: 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 o tempo todo:
[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 repetidamente falhar na execução 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 255
, systemd
desiste 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?
StartLimitIntervalSec=0
e voilà.Sim existe. Você pode especificar tentar novamente após
x
segundos na[Service]
seçãoDepois de salvar o arquivo, você precisa recarregar as configurações do daemon para garantir o
systemd
conhecimento do novo arquivo,reinicie o serviço para ativar as alterações,
Como você solicitou, Examinando a documentação,
parece uma recomendação decente.
fonte
RestartSec
diretiva, assystemd
tentativas de reinicialização muito rápidas e entram em um estado de falha permanente; algo que não pode acontecer quandoRestartSec
é especificado?always
é um superconjunto deon-failure
, portanto, não ajudará!Não. O systemd desiste de tentar reiniciá-lo por um tempo . Isso é mostrado claramente no log que você fornece:
Isso é uma limitação da taxa de entrada.
A duração do pouco tempo é especificada na unidade de serviço, usando a
StartLimitIntervalSec=
configuração O número de partidas necessárias dentro desse intervalo para acionar o mecanismo de limitação de taxa é especificado através daStartLimitBurst=
configuração. Se nada no seu sistema diferir do vanilla systemd, incluindo os padrões dessas duas configurações, serão 5 vezes em 10 segundos.StartLimitIntervalSec=0
desabilita a limitação de taxa, para que o systemd tente novamente para sempre, em vez de desistir. Mas tornar seu serviço ou não sair com tanta frequência ou inativo o suficiente entre saídas e reinicializações para que não exceda o limite de limitação de taxa, é uma abordagem melhor.Observe que a limitação da taxa não se importa com a saída do serviço. Ele dispara no número de tentativas de iniciá-lo / reiniciá-lo, independentemente de sua causa.
Leitura adicional
systemd.unit
. páginas de manual do systemd. freedesktop.org.fonte
StartLimitIntervalSec=10
eStartLimitIntervalSec=5
, sem sorte.StartLimitIntervalSec=0
.