Linux: Escrevendo um watchdog para monitorar vários processos

14

Há alguns anos, um colega de trabalho surgiu com uma solução elegante para um programa de monitoramento. O programa foi executado no Windows e usou objetos de evento do Windows para monitorar o processo manipula (PID's) de várias aplicações. Se qualquer um dos processos terminasse inesperadamente, seu identificador de processo não existiria mais e seu watchdog seria imediatamente sinalizado. O cão de guarda tomaria então uma ação apropriada para “curar” o sistema.

A minha pergunta é, como você implementaria esse watchdog no Linux? Existe uma maneira de um único programa monitorar os PIDs de muitos outros?

    
por Justin Ethier 18.02.2011 / 21:43

2 respostas

17

O modo tradicional, portátil e comumente usado é que o processo pai cuida de seus filhos.

As primitivas básicas são as wait e waitpid chamadas do sistema. Quando um processo filho morre, o processo pai recebe um sinal SIGCHLD , informando que deve chamar wait para saber qual filho morreu e seu status de saída. O processo pai pode optar por ignorar SIGCHLD e chamar waitpid(-1, &status, WNOHANG) quando for conveniente.

Para monitorar muitos processos, você poderia gerar todos eles a partir do mesmo pai ou invocá-los por meio de um processo de monitoramento simples que apenas chama o programa desejado, aguarda que ele termine e relate a terminação (na sintaxe do shell: %código%). Se você está vindo do mundo do Windows, observe que ter pequenos programas executando uma tarefa especializada é um projeto comum no mundo Unix, o sistema operacional foi projetado para tornar os processos baratos.

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

    
por 18.02.2011 / 22:34
0

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

    
por 21.02.2011 / 05:43