Linux: écrire un chien de garde pour surveiller plusieurs processus


14

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?


Voir aussi S'assurer qu'un processus est toujours en cours d' exécution pour une liste de programmes de surveillance / supervision.
Gilles 'SO- arrête d'être méchant'

Réponses:


17

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 waitetwaitpid . Lorsqu'un processus enfant meurt, le processus parent reçoit un SIGCHLDsignal lui indiquant qu'il doit appeler waitpour savoir quel enfant est décédé et son statut de sortie. Le processus parent peut plutôt choisir d'ignorer SIGCHLDet d'appeler waitpid(-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 ,…


+1, exactement ce que je cherchais - merci pour cette réponse si détaillée.
Justin Ethier

0

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.