Linux: Criando um cão de guarda para monitorar vários processos


14

Alguns anos atrás, um colega de trabalho encontrou uma solução elegante para um programa de vigilância. O programa foi executado no Windows e usou objetos de eventos do Windows para monitorar os identificadores de processo (PIDs) de vários aplicativos. Se qualquer um dos processos terminasse inesperadamente, seu identificador de processo não existiria mais e seu cão de guarda seria imediatamente sinalizado. O cão de guarda tomaria uma ação apropriada para "curar" o sistema.

Minha pergunta é: como você implementaria esse cão de guarda no Linux? Existe uma maneira de um único programa monitorar os PIDs de muitos outros?


Consulte também Certifique-se de que um processo esteja sempre em execução para obter uma lista de programas de monitoramento / supervisão.
Gilles 'SO- stop be evil'

Respostas:


17

A maneira tradicional, portátil e comumente usada é que o processo pai zele por seus filhos.

As primitivas básicas são as chamadas waite dowaitpid sistema. Quando um processo filho morre, o processo pai recebe um SIGCHLDsinal, informando que deve ligar waitpara saber qual filho morreu e seu status de saída. O processo pai pode optar por ignorar SIGCHLDe chamar waitpid(-1, &status, WNOHANG)conforme sua conveniência.

Para monitorar muitos processos, você os geraria todos do mesmo pai ou os invocaria através de um processo simples de monitoramento que apenas chama o programa desejado, aguarda o término e relata o término (na sintaxe do shell:) myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe. Se você é do mundo Windows, observe que ter pequenos programas executando uma tarefa especializada é um design comum no mundo Unix, o sistema operacional foi projetado para tornar os processos baratos.

Existem muitos programas de monitoramento de processo (também chamados de supervisor) que podem relatar quando um processo morre e, opcionalmente, reiniciá-lo e muito mais: Monit , Supervisionar , Iniciante ,…


+1, exatamente o que eu estava procurando - obrigado por uma resposta tão detalhada.
Justin Ethier

0

Minha abordagem para esse problema é usar o init e sua diretiva de respawn interna para iniciar / reiniciar o que você precisar executar. Essa era sua intenção original e principal objetivo. Em alguns casos, você precisará executar um script para limpar após a morte de um processo ou se preparar para o início do processo (na maioria das vezes o trabalho é o mesmo). Na maioria dos casos, um script bash que termina em exec funciona muito bem para isso.

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.