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?
linux
process
monitoring
Justin Ethier
fuente
fuente
Respuestas:
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
wait
ywaitpid
llamadas al sistema. Cuando un proceso hijo muere, el proceso padre recibe unaSIGCHLD
señal, diciéndole que debe llamarwait
para saber qué hijo murió y su estado de salida. El proceso principal puede optar por ignorarSIGCHLD
y llamarwaitpid(-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 , ...
fuente
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.
fuente