2011-07-26 11 views
19

que utiliza child_process.exec/child_process.spawn que desembolsar un nuevo proceso y luego matarlo usando child.kill/process.kill. Funciona bien con los ejecutables binarios simples, como cat/ls, y el proceso hijo acaba de ser asesinado.no proceso de perder la vida del niño con Node.JS

Sin embargo, cuando llega a las secuencias de comandos (por ejemplo P1) que tenedores otro proceso hijo (por ejemplo P2), sólo el guión intérprete P1 maten, no el proceso P2 niño.

PREGUNTA: ¿hay alguna forma de que se procese este proceso infantil P2 con Node.JS?

Código funciona bien con run_and_kill('ls -Al /usr/lib'), pero no bien con 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

se puede tratar de matarlos de forma manual (probablemente P2 ignora SIGHUP) - http://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes –

+0

@AndreySidorov Cómo matar manualmente w/o sabiendo su PID? – Ghostoy

+0

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

Respuesta

1

Creo que su P2 no es ni un tenedor o un niño de P1 sino más bien un proceso paralelo generado por el mismo. En el caso de Firefox (al menos en Linux), la aplicación de Firefox se inicia mediante un script de shell contenedor. Si siempre va a ser Firefox, mejor ejecutar el binario directo desde su carpeta de instalación

3

La forma más segura que he encontrado para lograr esto es la creación de un proceso de desove para matar a la señal, utilizando el child.pid como argumento. Ejemplo con tenedor:

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)'); 

Me suelen utilizar esto en las características, la mayoría en beforeAll/Después de todo bloques para iniciar/matar servidores (en el ejemplo' ./index.js').

+0

esto funciona, siempre y cuando * esos * procesos hijos también salgan :) que deberían –

Cuestiones relacionadas