Linux: escribir un perro guardián para monitorear múltiples procesos


14

Hace unos años, a un compañero de trabajo se le ocurrió una solución elegante para un programa de vigilancia. El programa se ejecutó en Windows y usó objetos de eventos de Windows para monitorear los identificadores de proceso (PID) de varias aplicaciones. Si alguno de los procesos terminara inesperadamente, su identificador de proceso ya no existiría y su perro guardián sería señalado de inmediato. El perro guardián tomaría una acción apropiada para "sanar" el sistema.

Mi pregunta es, ¿cómo implementaría tal watchdog en Linux? ¿Hay alguna manera de que un solo programa monitoree los PID de muchos otros?


Consulte también Asegúrese de que un proceso siempre se esté ejecutando para obtener una lista de los programas de supervisión / supervisión.
Gilles 'SO- deja de ser malvado'

Respuestas:


17

La forma tradicional, portátil y de uso común es que el proceso padre vigila a sus hijos.

Las primitivas básicas son las waitywaitpid llamadas al sistema. Cuando un proceso hijo muere, el proceso padre recibe una SIGCHLDseñal, diciéndole que debe llamar waitpara saber qué hijo murió y su estado de salida. El proceso principal puede optar por ignorar SIGCHLDy llamar waitpid(-1, &status, WNOHANG)a su conveniencia.

Para monitorear muchos procesos, puede generarlos todos desde el mismo padre o invocarlos a todos a través de un proceso de monitoreo simple que solo llama al programa deseado, espera a que termine e informa sobre la terminación (en la sintaxis de shell:) myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe. Si viene del mundo de Windows, tenga en cuenta que tener programas pequeños que realizan una tarea especializada es un diseño común en el mundo de Unix, el sistema operativo está diseñado para hacer que los procesos sean económicos.

Hay muchos programas de monitoreo de procesos (también llamados supervisores) que pueden informar cuando un proceso muere y, opcionalmente, reiniciarlo y mucho más además: Monit , Supervise , Upstart , ...


+1, exactamente lo que estaba buscando, gracias por una respuesta tan detallada.
Justin Ethier

0

Mi enfoque para este problema es usar init y su directiva de reaparición incorporada para iniciar / reiniciar lo que sea que necesite ejecutar. Esta fue su intención original y su propósito principal. En algunos casos, deberá ejecutar una secuencia de comandos para la limpieza después de que un proceso haya muerto o para prepararse para que comience el proceso (la mayoría de las veces el trabajo es el mismo). En la mayoría de los casos, un script bash que termina en exec funciona muy bien para esto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.