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?

baiacu
fonte
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.

Cian
fonte
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.

Juliano
fonte
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.

Kyle Brandt
fonte
+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
Ramon Poca
fonte
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.

djhowell
fonte
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.

Rory
fonte
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