Il y a quelques années, un collègue a trouvé une solution élégante pour un programme de surveillance. Le programme fonctionnait sous Windows et utilisait des objets d'événement Windows pour surveiller les descripteurs de processus (PID) de plusieurs applications. Si l'un des processus se terminait de façon inattendue, son descripteur de processus n'existerait plus et son chien de garde serait immédiatement signalé. Le chien de garde prendrait alors une mesure appropriée pour «guérir» le système.
Ma question est, comment implémenteriez-vous un tel chien de garde sous Linux? Existe-t-il un moyen pour un seul programme de surveiller les PID de nombreux autres?
linux
process
monitoring
Justin Ethier
la source
la source
Réponses:
La manière traditionnelle, portable et couramment utilisée est que le processus parent veille sur ses enfants.
Les primitives de base sont les appels système
wait
etwaitpid
. Lorsqu'un processus enfant meurt, le processus parent reçoit unSIGCHLD
signal lui indiquant qu'il doit appelerwait
pour savoir quel enfant est décédé et son statut de sortie. Le processus parent peut plutôt choisir d'ignorerSIGCHLD
et d'appelerwaitpid(-1, &status, WNOHANG)
à sa convenance.Pour surveiller de nombreux processus, vous devez soit les générer tous à partir du même parent, soit les invoquer tous via un processus de surveillance simple qui appelle simplement le programme souhaité, attend qu'il se termine et signale la terminaison (dans la syntaxe du shell:)
myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe
. Si vous venez du monde Windows, notez que le fait d'avoir de petits programmes effectuant une tâche spécialisée est une conception courante dans le monde Unix, le système d'exploitation est conçu pour rendre les processus bon marché.Il existe de nombreux programmes de surveillance de processus (également appelé superviseur) qui peuvent signaler la fin d'un processus et éventuellement le redémarrer et bien plus encore: Monit , Superviser , Upstart ,…
la source
Mon approche de ce problème consiste à utiliser init et sa directive respawn intégrée pour démarrer / redémarrer tout ce dont vous avez besoin pour exécuter. C'était son intention initiale et son objectif principal. Dans certains cas, vous devrez exécuter un script pour nettoyer après la fin d'un processus ou pour préparer le démarrage du processus (la plupart du temps, le travail est le même). Dans la plupart des cas, un script bash qui se termine par exec fonctionne très bien pour cela.
la source