2010-08-20 7 views
3

J'utilise supervisord pour générer et gérer une application FastCGI que j'écris en C pour une cible Linux. J'ai un gestionnaire de signal qui quitte gracieusement mon application quand SIGINT est reçu. J'ai vérifié que le gestionnaire de signal fonctionne comme souhaité en exécutant l'application dans une fenêtre de terminal et en émettant Ctrl-C pour quitter.Transmission de signal aux processus gérés à l'aide du superviseur

Lors de l'émission d'une commande « d'arrêt » à supervisord (via supervisorctl), il semble que supervisord ne peut pas forcer l'application à quitter sans invoquer SIGKILL:

2010-08-20 10:02:49,661 INFO waiting for cse to die 
2010-08-20 10:02:52,665 INFO waiting for cse to die 
2010-08-20 10:02:55,669 INFO waiting for cse to die 
2010-08-20 10:02:58,672 INFO waiting for cse to die 
2010-08-20 10:02:59,673 WARN killing 'cse' (2031) with SIGKILL 
2010-08-20 10:02:59,674 INFO stopped: cse (terminated by SIGKILL) 

je suit dans mon supervisord.conf fichier

stopsignal=INT 

Il est mon hypothèse que supervisord questions « stopsignal » à l'invocation de la commande d'arrêt, alors je prends les déclarations INFO comme une indication que mon application ne répond pas à l'SIGINT émis par supervisord.

Comment procéder pour déboguer le signal passant entre supervord et mon application?

+0

Je confirme que INT est émis à l'invocation de la commande d'arrêt, de sorte que le "... en attendant que cse meure" Les entrées du journal indiquent clairement que l'application ne voit pas SIGINT. – HikeOnPast

Répondre

3

Après un peu plus creuser, il semble que la question n'est pas supervisord ne parvient pas à passer des signaux aux processus enfants. Cela semble fonctionner normalement. Au lieu de cela, il semble que supervord arrête la journalisation de la sortie stderr du processus enfant une fois qu'il reçoit une requête pour appeler le signal stops. Par conséquent, toute journalisation basée sur stderr de l'arrêt du processus enfant ne sera pas traitée par le superviseur. Dans mon cas, cela donnait l'impression que le processus fils ne recevait pas SIGINT, car il ne consignait rien dans stderr après l'appel du signal.

+1

Existe-t-il un moyen d'obtenir 'supervisord' pour continuer à collecter la sortie de journal après qu'un processus a été envoyé' SIGINT' à partir d'une commande 'stop'? – Neil

+1

+1 sur la question de @ Neil. Ne pas voir 'stdout' et' stderr' rend impossible le débogage des problèmes lors de l'arrêt. –

2

Vous pouvez exécuter supervord sur la ligne de commande en mode débogage et obtenir plus d'informations.

supervisord -n -e débogage

+0

Merci. La sortie que j'ai publiée à l'origine a été générée en utilisant l'équivalent supervord.conf de "-n -e debug" (ne pas démoniser et utiliser la journalisation du niveau de débogage). – HikeOnPast

Questions connexes