Como reiniciar um executável se ele morrer


8

Estou procurando uma maneira de monitorar um processo e reiniciar o executável se o processo morrer por qualquer motivo. O Linux possui uma ferramenta interna que pode fazer isso?


Há mais algumas respostas e ponteiros em esta questão serverfault.com/questions/56526/...
JRG

Respostas:


7

Se for iniciado a partir do init, você poderá reaparecer pelo init. Defina a ação para o processo 'reaparecer' para os níveis de execução em que você deseja o processo.


Da mesma forma, o launchd é bastante agradável.
21411 Jeremy L

Sim. As ferramentas do Daemon também são muito legais para esse tipo de coisa, mas são reprovadas no teste 'embutido'.
Cian

10

Eu já respondi uma pergunta semelhante antes .

No seu caso:

#!/bin/bash
while ! <<command>>
do
  sleep 1
  echo "Restarting program..."
done

Substitua <<command>>pelo comando que você deseja executar. O processo precisa terminar com o código de saída zero para interromper o loop. Caso contrário, ele será reiniciado pelo script.


Agradável. Isso funciona com o ksh também, e eu mudaria o comando "echo" para um "logger" para colocar a mensagem nos logs do sistema.
Mei

Resposta perfeita, mano.
Arunjith RS 30/04/19

4

Deseja apenas reiniciá-lo se morrer? O problema é que ele não lida com situações em que congela. Portanto, apenas verificar o processo nem sempre ajuda. Portanto, se isso é algo como um servidor da web, você deseja que um script o verifique da perspectiva do usuário.

Se você configurar o Nagios Monitoring, poderá usar manipuladores de eventos . Esses são apenas os scripts que você escreve que serão executados quando o serviço for desativado; portanto, você pode ter um que reinicie algo como o Apache se o site estiver inativo.


+1, lembre-se de cobrir também situações em que ele é intencionalmente morto.
Maximus Minimus

Bom ponto, embora no meu caso o processo simplesmente desaparece
baiacu

3

Dependendo da distribuição, mas usamos com êxito "monit" para esta tarefa. É bem fácil. Você pode escrever seus próprios cheques, monitorar o processo PID, etc.

Arquivo monitrc de exemplo:

check process sshd with pidfile /var/run/sshd.pid
   start program  "/etc/init.d/ssh start"
   stop program  "/etc/init.d/ssh stop"
   if failed port 22 protocol ssh then restart
   if 5 restarts within 5 cycles then timeout

2

Por que não um script simples do bash?

#!/usr/bin/bash
while `true`
do
  xeyes
done

Substitua xeyes pelo programa de sua escolha.


0

Resposta curta : Não, você precisa fazer isso sozinho.

Resposta longa : você precisará de um processo pai para iniciá-lo e continue verificando se está ativo e reinicie-o, se necessário.

Você pode usar algo parecido daemontoolspara gerenciá-lo.


Resposta curta: você está completamente errado. Resposta longa: se uma distribuição Linux não tiver inittab, ela terá /etc/event.d/ - qualquer mecanismo reiniciará um processo quando morrer.
21139 Paul Tomblin
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.