Como supervisionar e reiniciar automaticamente um processo?

34

Eu quero ter um processo que será reiniciado se falhar. Pesquisei um pouco no Google e descobri que uma solução fácil é usar daemontools .

Não entendi como configurá-lo.

  1. Qual é a maneira mais fácil de realizar essa funcionalidade?
  2. Como configurá-lo?
opc0de
fonte

Respostas:

29

Esta resposta se aplica às versões do Ubuntu com Upstart (<= 14.10). Use outra abordagem para versões com Systemd (> = 15.04).

Parece que você está procurando uma funcionalidade já fornecida no Ubuntu com Upstart . A respawnestrofe na configuração fará exatamente o que você precisa. Eu recomendaria contra o uso de uma maneira menos padrão de lidar com isso.

Sem mais detalhes sobre o processo que você está tentando gerenciar, é difícil dizer como deve ser a configuração. Depende se ele se bifurca e se coloca em segundo plano, por exemplo. A documentação do Upstart na respawnestrofe deve fornecer mais informações.

Infelizmente, ainda não é possível executar tarefas do usuário corretamente: não é possível iniciar o processo para executar tarefas do usuário

Exemplo

Vamos supor que queremos manter o aplicativo Calculadora em execução, mesmo quando ele está sendo morto com fogo (sinal 9).

  1. Crie um arquivo de configuração em /etc/init/calculator.conf(com base neste artigo ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. Inicie executando

    sudo start calculator
    
  3. Ele abre na tela atual ( :0) e desfruta da grandiosidade vendo-a reiniciar após fechá-la.

    • Identifique o ID do processo, por exemplo, fazendo ps aux | grep calculator:

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • Matá-lo com fogo.

      sudo kill -9 13695
      
    • Assista reaparecendo:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

Observe que isso ficará mais elegante com os planos para os planos Ubuntu 13.04, com o suporte adequado ao Job User.

gertvdijk
fonte
Recebo um trabalho desconhecido quando tento iniciá-lo? qualquer ideea. Eu coloquei o arquivo em / etc / init
opc0de
@ opc0de O nome do arquivo servicename.confdeve corresponder ao comando para iniciar start servicename. Eu suspeito que você escolheu um nome diferente.
precisa saber é o seguinte
Não, corresponde, mas eu não segui o seu exemplo, então acho que posso ter um erro de sintaxe.
Opc0de
@ opc0de Bem, comece explicando mais sobre o que você está tentando realizar na pergunta: que tipo de aplicativo / processo e como você o executa, por exemplo, bem como os detalhes sobre sua tentativa atual.
gertvdijk
Resolvido com o seu exemplo, meu erro foi que eu provavelmente tive um erro no estatuto de exec. Obrigado pela ajuda!
Opc0de
13

Uma ferramenta extremamente simples que pode obter o mesmo efeito sem a necessidade de configuração é immortal: https://immortal.run/

Simplesmente execute o comando assim:

immortal <cmd>

Ele será executado em segundo plano e reiniciado automaticamente se sair.

  • immortalctl: Exibe o status dos trabalhos em execução. Há uma namecoluna que será impressa aqui, você pode usar isso para se referir ao trabalho com outros comandos de controle.
  • immortalctl stop <name>: Interrompe o monitoramento do trabalho com o nome fornecido (ele não será reiniciado automaticamente, mas o processo atual continuará sendo executado)
  • immortalctl -k <name>: Envia SIGKILL para o processo atual.
  • immortalctl exit <name>: Interrompe o monitoramento do trabalho com o nome fornecido e o remove da lista de trabalhos.
motor extrópico
fonte
11
Obrigado, isso funcionou muito bem para o meu caso de uso na 16.04. Colocando isso na minha bolsa de ferramentas úteis.
Quentin Skousen
2
De fato, isso parece mais leve que o iniciante / reaparecer.
Sridhar Sarnobat
Existe uma maneira de exibi-lo stdoute stderrem primeiro plano?
David S.
Não conheço um, pois geralmente é usado para executar um processo em segundo plano. No entanto, você pode usar immortalctl -l out.log <cmd> && tail -f out.logpara obter o mesmo efeito.
extropic-engine 08/08/19
@DavidS. você pode obter um log combinado ou ter stdout e stderr immortal.run/post/stderr
nbari
1

Se você não precisar da funcionalidade do processo daemon / service / background e quiser fazê-lo no console, crie um arquivo chamado autorestart.sh:

#!/bin/bash

while [ 1 ]; do
  some_command
done

Em seguida ./autorestart.sh, reiniciará automaticamente some_commandse sair ou travar. CTRL-C interrompe o loop e fecha o programa corretamente.

Testado no Ubuntu 18.04.

Jan Święcki
fonte
0

Existe uma maneira sem "Upstart". A palavra-chave é "inittab" :-). Embora esse arquivo normalmente não seja alterado do padrão, ele pode ser usado para obter o respawning desejado nas máquinas SYSV.

cepal67
fonte
Não entendo por que alguém rejeitou esta solução. Se você não entender, apenas pesquise no Google; não faz sentido recortar e colar aqui as páginas de manual da initttab, você pode lê-las no seu sistema! basta digitar "man inittab" ...
cepal67 16/06
13
Alta qualidade responde detalhe mais do que "usar este, figura-o para fora em seu próprio país" :)
Seth
0

O ps-watcher é uma ferramenta que observa quais processos estão em execução e executa uma ação em circunstâncias definidas. Vamos instalá-lo:

apt-get install ps-watcher

Veja a parte inferior do HHVM em execução com fallback do PHP-FPM para obter detalhes - isso funcionou bem para mim.

Firegarden
fonte
Como não é muito longo, adicione um resumo do código em vez do artigo, porque apenas uma seção muito curta se aplica a esta pergunta.
DerHugo 19/09/2017
0

Os processos de inicialização e reaparecimento são gerenciados pelo "systemd" desde o Ubuntu 15.04, uma boa introdução pode ser encontrada aqui

https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal

um exemplo de introdução está disponível em

https://www.devdungeon.com/content/creating-systemd-service-files

Essa abordagem substitui as mais antigas com base no / etc / inittab e no inicio.

Nikolaus Correll
fonte