9
votes

Détecter lorsque le processus parent quitte

Je vais avoir un processus de parent utilisé pour gérer les redémarrages WebServer. Il signalera l'enfant à cesser d'écouter de nouvelles demandes, l'enfant signalera le parent qu'il a cessé d'écouter, puis le parent signalera le nouvel enfant qu'il peut commencer à écouter. De cette manière, nous pouvons accomplir moins de 100 ms du temps pour un redémarrage de ce niveau (j'ai également un souvenir de petit-enfant de temps nulle, mais ce n'est pas toujours assez de redémarrage).

Le gestionnaire de service tuera le parent quand il est temps d'arrêter. Comment l'enfant peut-il détecter que le parent est terminé?

Les signaux sont envoyés avec STDIN et STDOUT du processus d'enfant. Je peux peut-être détecter la fin d'un flux STDIN? J'espère éviter un intervalle de vote. En outre, j'aimerais que cela soit une détection très rapide si possible.


0 commentaires

4 Réponses :


5
votes

Pourriez-vous simplement mettre un EXIT AUTRÊTE dans le processus parent qui signale les enfants?

edit:
Vous pouvez également utiliser Node-FFI (interface de fonction étranger du nœud) pour appeler ...
PRCTL (pr_set_pdathsig, Sighup);
... à Linux. (
MAN 2 PRCTL )


3 commentaires

Je pense que cela fonctionnera. Le parent est tué quand il est temps de fermer, mais je suis sûr que l'auditeur de sortie fonctionnera toujours. Peut-être que je peux toujours Rechercher un ID de processus parent toutes les quelques secondes et si cela devient le Numéro 1, cela signifie que le parent est mort.


Si vous arrêtez, vos processus recevront sigterm en premier. Vous pouvez également capturer cela et faire un nettoyage de cette manière aussi: processus.on ('sigterm', fonction () {console.log ('a obtenu sigterm, sortant ...'); // faire un certain nettoyage ici .. . Process.exit (0);});


Et oui, avoir des enfants vérifier périodiquement si leur ppid est devenu 1 est une bonne baisse pour les cas où le parent n'a pas quitté la propreté. Voir aussi: Stackoverflow.com/Questtions/269494/...



8
votes

Cette réponse est juste pour fournir un exemple de la solution de nœud-ffi que Entropo a proposé (ci-dessus) (comme mentionné, il fonctionnera sur Linux):

Ceci est le processus parent, il se reproduit l'enfant, puis Quitter après 5 secondes: xxx

Ceci est le processus enfant (situé dans l'enfant.js) xxx

sans le courant .prctl (1,15) L'enfant va courir pour toujours même si le parent meurt. Ici, il sera signalé avec un sigterm qui sera géré gracieusement.


2 commentaires

Pour ceux qui mettent en œuvre cette solution. N'appelez pas processus.exit (1) jusqu'à ce que vous soyez effectivement effectué. logger.warn ("sigterm. sortant gracieusement.", fonction () {processus.exit (1);})


On dirait que le nœud FFI a été obsolète en faveur du nouveau module "FFI".



2
votes

Je commence nœud.js à partir d'une application OSX native comme ouvrier de fond. Pour fabriquer des nœud.js Quitter lorsque le processus parent qui consomme des matrices / sorties nœud.js stdout, je suis ce qui suit: xxx

facile comme ça, mais je ne suis pas vraiment sûr que c'est quoi que ce soit Vous avez demandé; -)


1 commentaires

Je me luttais avec ce cas d'utilisation et cela fonctionne brillamment. À votre santé!



17
votes

Une solution plus simple pourrait être en vous inscrivant à "déconnecter" dans le processus enfant xxx


2 commentaires

Merci! J'ai tout essayé et cela semble être le seul moyen d'attraper que votre processus de parent a été tué -9.


Je suis totalement d'accord pour dire que c'est une excellente solution. Dans mon cas, j'écoutais sur l'événement SIGTERM du processus parent et également (si quelque chose de mauvais se produit et que je dois redémarrer le processus parent) lors de la déconnexion. Dans mon cas, le problème est perceptible, car le processus d'enfant crée un port de maintien du serveur, alors commencez à nouveau causer une "errordrinuse". Cela résout le problème :)