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?
linux
process
monitoring
Justin Ethier
fonte
fonte
Respostas:
A maneira tradicional, portátil e comumente usada é que o processo pai zele por seus filhos.
As primitivas básicas são as chamadas
wait
e dowaitpid
sistema. Quando um processo filho morre, o processo pai recebe umSIGCHLD
sinal, informando que deve ligarwait
para saber qual filho morreu e seu status de saída. O processo pai pode optar por ignorarSIGCHLD
e chamarwaitpid(-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 ,…
fonte
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.
fonte