2012-08-09 2 views
11

Est-il possible de s'assurer que les processus engendrés par node.js child_process seront détruits lorsque le parent sera tué?node.js processus spawned reste si le script est tué

Voici un exemple de script

var spawn = require('child_process').spawn; 
var log_tail = spawn("tail", ["-f", "/dev/null"]); 

setInterval(function() { 
    console.log('just chilling'); 
}, 10000); 

Si je regarde l'arbre de processus que je vois ceci:

$ ps faux 
ubuntu 9788 0.0 0.0 73352 1840 ?  S 15:04 0:00 | \_ sshd: [email protected]/7 
ubuntu 9789 0.0 0.2 25400 6804 pts/7 Ss 15:04 0:00 |  \_ -bash 
ubuntu 10149 1.0 0.2 655636 8696 pts/7 Sl+ 15:07 0:00 |   \_ node test.js 
ubuntu 10151 0.0 0.0 7184 608 pts/7 S+ 15:07 0:00 |    \_ tail -f /dev/null 

Je dois ensuite plus tard pour arrêter ce script et ne peut pas ctrl-c (par exemple ma connexion ssh est perdue)

$ kill 10149 
$ ps faux 
ubuntu 10151 0.0 0.0 7184 608 pts/7 S 15:07 0:00 tail -f /dev/null 

Vous pouvez voir que le processus de queue est toujours en cours d'exécution et a se détacher de toute pa location.

Existe-t-il un moyen de tuer un processus engendré si le géniteur est tué?

Existe-t-il une option que je peux passer pour générer ou dois-je utiliser une méthode différente ou ai-je besoin d'attraper le signal kill (et cela fonctionnera-t-il pour un kill -9)?

+0

Mon problème est exactement le contraire. Les processus engendrés ne sont pas maintenus en vie si le parent meurt, et c'est ce que je veux. – cprcrack

+1

Mise à jour: semble se produire uniquement sur Windows. – cprcrack

Répondre

14

Pas très propice au travail, mais cela sert de modèle que j'utilise:

var spawn = require("child_process").spawn; 
var workers = []; 

var killWorkers = function() { 
    workers.forEach(function(worker) { 
    process.kill(worker); 
    }); 
}); 

process.on("uncaughtException", killWorkers); 
process.on("SIGINT", killWorkers); 
process.on("SIGTERM", killWorkers); 

var new_worker = spawn("tail", ["-f", "/dev/null"]); 
workers.push(new_worker); 

J'utilise principalement cela pour tuer les travailleurs dans un cluster lorsque le processus maître meurt. Ed: De toute évidence, vous pouvez simplement appeler killWorkers de n'importe où, pas seulement des plantages ou des interruptions.

+0

notez que kill -9 laissera toujours les travailleurs autour. Pour mon cas d'utilisation, c'est probablement correct, mais méfiez-vous de –

+0

. 'kill -9' ne lancera même pas l'événement' exit' du processus; Je ne sais pas comment vous pourriez l'attraper à l'intérieur du nœud dans ce cas. – cjohn

Questions connexes