2012-08-09 11 views
11

¿Es posible asegurarse de que los procesos generados con node_j child_process se eliminen cuando el padre se destruye?node.js proceso generado se queda si se destruye el script

He aquí un ejemplo de script

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

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

Si miro el árbol de procesos veo esto:

$ 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 

Luego, más tarde Tengo que dejar que el guión y no puedo Ctrl-C (digamos mi conexión ssh se pierde)

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

se puede ver que el proceso de la cola todavía está en marcha y se ha separado de cualquier pa alquilar.

¿Existe una forma de programa para matar un proceso engendrado si se mata al reproductor?

¿Hay una opción que pueda pasar para engendrar o debería usar un método diferente o necesito atrapar la señal de muerte (y eso funcionará para matar -9)?

+0

Mi problema es todo lo contrario. Los procesos engendrados no se mantienen vivos si el padre muere, y eso es lo que quiero. – cprcrack

+1

Actualización: parece suceder solo en Windows. – cprcrack

Respuesta

14

No es una labor muy amable, pero esto sirve como la plantilla que utilizo:

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

utilizo sobre todo esto para matar a los trabajadores en un clúster cuando el proceso maestro muere. Ed: Obviamente, puedes llamar al killWorkers desde cualquier lugar, no solo bloqueos o interrupciones.

+0

tenga en cuenta que matar -9 aún dejará a los trabajadores cerca. Para mi caso de uso, probablemente esté bien, pero cuidado con –

+0

Derecha. 'kill -9' en realidad no activará el evento' exit' del proceso; no estoy seguro de cómo lo atraparía dentro del nodo en ese caso. – cjohn

Cuestiones relacionadas