reinicialização automática do serviço systemd após StartLimitInterval


33

Quero que meu serviço systemd seja reiniciado automaticamente em caso de falha. Além disso, eu quero classificar limitar as reinicializações. Desejo permitir no máximo três reinicializações dentro de 90 segundos de duração. Portanto, eu fiz a seguinte configuração.

[Serviço]
Reiniciar = sempre
StartLimitInterval = 90
StartLimitBurst = 3

Agora o serviço é reiniciado em caso de falha. Após 3 falhas / reinicializações rápidas, ele não é mais reiniciado conforme o esperado. Agora eu esperava que o systemd iniciasse o serviço após o tempo limite (StartLimitInterval). Mas o systemd não está iniciando o serviço automaticamente após o tempo limite (90seg), se eu reiniciar o serviço manualmente após o tempo limite em funcionamento. Mas eu quero que o systemd inicie automaticamente o serviço após o StartLimitInterval. Informe-me sobre como obter esse recurso.


3
Escrevi um artigo que explica como criar um serviço e como evitar esse problema específico: Criando um serviço Linux com o systemd .
Benjamin

2
Eu acho que você está procurando StartLimitIntervalSec, não StartLimitInterval.
Marc Tamsky

Respostas:


30

Para que um serviço seja reiniciado três vezes em intervalos de 90 segundos, inclua as seguintes linhas no arquivo de serviço systemd:

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

Isso funcionou para mim para um serviço que executa um script usando 'Type = idle'. Observe que 'StartLimitInterval' deve ser maior que 'RestartSec * StartLimitBurst', caso contrário, o serviço será reiniciado indefinidamente.

Levei algum tempo com muitas tentativas e erros para descobrir como o systemd usa essas opções, o que sugere que o systemd não está tão documentado quanto se poderia esperar. Essas opções fornecem efetivamente o tempo do ciclo de repetição e tentativas máximas que eu estava procurando.


Este deve ser marcado como resposta aceita ...
Jeff

não consigo encontrar a StartLimitInterval=diretiva no meu ubuntu 18 mais recente ...
wick

10

O comportamento que você descreve é ​​consistente com a documentação:

StartLimitInterval =, StartLimitBurst = Configurar limite de taxa de início do serviço. Por padrão, os serviços iniciados mais de 5 vezes em 10 segundos não têm permissão para iniciar mais vezes até o intervalo de 10 segundos. Com essas duas opções, esse limite de taxa pode ser modificado. Use StartLimitInterval = para configurar o intervalo de verificação (o padrão é DefaultStartLimitInterval = no arquivo de configuração do gerenciador, definido como 0 para desativar qualquer tipo de limitação de taxa). Use StartLimitBurst = para configurar quantas partidas por intervalo são permitidas (o padrão é DefaultStartLimitBurst = no arquivo de configuração do gerenciador). Essas opções de configuração são particularmente úteis em conjunto com Restart =; no entanto, eles se aplicam a todos os tipos de partidas (incluindo manual), não apenas àquelas acionadas pela lógica Reiniciar =.Observe que as unidades configuradas para Reiniciar = e que atingem o limite inicial não precisam mais ser reiniciadas; no entanto, eles ainda podem ser reiniciados manualmente em um momento posterior, a partir desse momento, a lógica de reinicialização é novamente ativada. Observe que systemctl reset-failed fará com que o contador da taxa de reinicialização de um serviço seja liberado, o que é útil se o administrador desejar iniciar um serviço manualmente e o limite de inicialização interferir nisso.

Ainda estou tentando descobrir uma maneira de realizar o comportamento que você deseja.


Isso é mais um comentário do que uma resposta, como você aponta.
Dave M

exatamente o que eu precisava, ty
Some Linux Nerd

De acordo com a documentação que você vinculou, não deveria ser StartLimitIntervalSec=(e DefaultStartLimitIntervalSec=)? Observe a adição de Secambos os nomes de parâmetros.
Doktor J

6

Alguns anos depois, e com o systemd 232, ele não funciona mais, conforme descrito na pergunta e nas respostas de 2016. O nome da opção StartLimitIntervalSece as seções foram alteradas. Agora ele deve se parecer com este exemplo:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

Isso fará 5 reinicializações em 30 segundos (5 * 6) mais uma reinicialização em 33 segundos. Portanto, temos 6 reinicializações em 33 segundos. Isso excede o limite de 5 reinicializações em 33 s. Portanto, as reinicializações param em 5 segundos após cerca de 31 segundos.


11
Parece que StartLimitIntervalainda há suporte, se não documentado, na Serviceseção. Mas o novo, preferido, StartLimitIntervalSecsó funciona Unit.
Danek Duvall 21/06

1

Você pode configurar OnFailurepara iniciar outro serviço quando isso falhar. No serviço em falha, você pode executar um script que aguarda e reinicia o serviço.

Para obter uma amostra de como configurar isso, consulte Correio do status do Systemd na falha da unidade e modifique-o para reiniciar o serviço.


1

Você pode usar StartLimitAction=reboot. Isso reiniciará o sistema após o StartLimitInterval.

StartLimitAction = Configure a ação a ser executada se o limite de taxa configurado com StartLimitInterval = e StartLimitBurst = for atingido. Tira uma das opções, reinicialização, força de reinicialização ou reinicialização imediata. Se nenhum estiver definido, atingir o limite da taxa não acionará nenhuma ação além de que o início não será permitido. reboot causa uma reinicialização seguindo o procedimento normal de desligamento (ou seja, equivalente à reinicialização do systemctl). força de reinicialização causa uma reinicialização forçada que encerrará todos os processos à força, mas não deve causar sistemas de arquivos sujos na reinicialização (ou seja, equivalente a systemctl reboot -f) e reinicialização imediata causa a execução imediata da chamada de sistema reinicialização (2), o que pode resultar em na perda de dados. O padrão é nenhum.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.