Como reiniciar automaticamente um serviço em caso de falha no Linux

19

No Windows, você pode definir o que deve acontecer se / quando um serviço falhar. Existe uma maneira padrão de conseguir a mesma coisa no Linux (CentOS em particular)?

Uma parte maior da minha pergunta é: como você lida com soquetes que foram deixados abertos - por exemplo, nos estados TIME_WAIT, FIN_WAIT1, etc.

No momento, se o serviço que estou desenvolvendo falhar, eu preciso esperar que os sockets limpem ou alterem a porta de escuta antes que eu possa reiniciá-lo manualmente.

Obrigado pela sua ajuda.

    
por Pryo 26.03.2011 / 12:26

4 respostas

24

monit é uma ótima maneira de monitorar e reiniciar serviços quando eles falham - e você provavelmente acabará usando isso para outros serviços essenciais (como o Apache). Existe um artigo sobre o nixCraft detalhando como usar isso para especificamente, embora monit tenha muitas outras funções além disso.

Quanto ao aspecto do socket, @galraen respondeu a este ponto.

    
por 26.03.2011 / 14:50
13

Você pode chamar setsockopt(2) para escutar soquete com SO_REUSEADDR , assim você poderá bind(2) novamente sem esperar pela expiração de todas as conexões. Outra possibilidade: descartar conexões do kernel. O FreeBSD tem o comando tcpdrop para isso, não sei sobre o Linux.

    
por 26.03.2011 / 12:36
10

Respondendo apenas a parte de reinicialização do serviço. Eu me deparei com o Monit também, mas no CentOS 7 o systemd cuida de tudo isso para você. Você só precisa adicionar essas duas linhas ao arquivo .service (se elas não estiverem lá):

Restart=always
RestartSec=3

Veja link para referência.

Se você deseja criar um serviço systemd personalizado, é bastante simples escrever seu próprio arquivo de serviço. Veja o exemplo abaixo, para um servidor http personalizado.

Inicie o editor com um novo arquivo de serviço:

vim /etc/systemd/system/httpd.service

Adicione o seguinte conteúdo, que você pode editar conforme necessário:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Eu quero que ele seja iniciado automaticamente na inicialização:

systemctl enable httpd

Diga ao systemd sobre as alterações e inicie o serviço:

systemctl daemon-reload
systemctl start httpd

E agora você pode ver o status:

systemctl status httpd

Para referência, consulte link

    
por 13.07.2017 / 11:36
4

Se a sua distribuição linux usa o Upstart em vez do SysV init, a palavra-chave respawn faz isso.

link

    
por 26.03.2011 / 14:57