2011-07-26 2 views
19

J'ai utilisé child_process.exec/child_process.spawn pour entamer un nouveau processus, puis le tuer en utilisant child.kill/process.kill. Il fonctionne très bien avec des exécutables binaires simples, tels que cat/ls, et le processus fils vient d'être tué.Processus enfant ne pas être tué avec Node.JS

Cependant, quand aller à les scripts (par exemple P1) que fourches un autre processus de l'enfant (par exemple P2), ne se font tuer l'interprète de script P1, pas le processus enfant P2.

QUESTION: Y at-il moyen de faire en sorte que ce processus P2 soit tué avec Node.JS?

code

fonctionne très bien avec run_and_kill('ls -Al /usr/lib'), mais pas OK avec run_and_kill('firefox'):

function run_and_kill(cmd) { 
    var exec = require('child_process').exec, 
     ls = exec(cmd); 
    console.log('Child process started: %d', ls.pid); 
    ls.on('exit', function(code, signal) { 
     console.log('exit with code %s and signal %s', code, signal); 
    }); 
    ls.kill(); 
} 
+0

vous pouvez essayer de les tuer manuellement (probablement P2 ignore SIGHUP) - http://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes –

+0

@AndreySidorov Comment tuer manuellement w/o connaître son PID? – Ghostoy

+0

vous le savez - 'ls.pid' (https://github.com/joyent/node/blob/master/lib/child_process.js#L250) –

Répondre

1

Je pense que votre P2 est ni une fourchette ou un enfant de P1 mais plutôt un processus parallèle donné naissance par celle-ci. Dans le cas de Firefox (au moins sous Linux), l'application firefox est lancée par un script shell wrapper. Si ça va toujours être firefox, il vaut mieux exécuter le binaire directement à partir de son dossier d'installation.

3

La méthode la plus sûre que j'ai trouvée pour y parvenir est de créer un processus de spawn pour tuer le signal, en utilisant le paramètre child.pid comme argument. Exemple avec une fourchette:

var process; 
process = require('child_process'); 

var fork, child; 
fork = process.fork; 
child = fork('./index'); 

var spawn; 
spawn = process.spawn; 
spawn('kill', [child.pid]); 
console.log('sending SIGTERM to child process (socket server)'); 

J'utilise généralement ce dans les spécifications, la plupart du temps dans des blocs beforeAll/Afterall pour démarrer/tuer des serveurs (dans l'exemple » ./index.js').

+0

cela fonctionne, tant que * ces * processus enfants sortent aussi :) qu'ils devraient –

Questions connexes