2012-08-09 9 views
11

È possibile assicurarsi che i processi generati con node.js child_process vengano uccisi quando il genitore viene ucciso?Il processo spawned di node.js resta bloccato se lo script viene ucciso

Ecco uno script di esempio

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

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

Se guardo l'albero processo vedo questo:

$ 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 

Poi più tardi ho bisogno di fermare lo script e non riesco a CTRL-C (per esempio la mia connessione ssh è persa)

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

Si può vedere che il processo di coda è ancora in esecuzione e si è staccato da qualsiasi pa affitto.

Esiste un modo programmatico per uccidere un processo generato se lo spawner viene ucciso?

Esiste un'opzione che posso passare allo spawn o devo usare un metodo diverso o devo catturare il segnale kill (e funzionerà per un kill -9)?

+0

Il mio problema è esattamente l'opposto. I processi generati non vengono mantenuti in vita se il genitore muore, ed è quello che voglio. Aggiornamento – cprcrack

+1

: sembra accadere solo su Windows. – cprcrack

risposta

14

Non molto lavoro amichevole, ma questo serve come il modello che uso:

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

ho principalmente utilizzare questo per l'uccisione di lavoratori in un cluster quando il processo padrone muore. Ed: Ovviamente, puoi semplicemente chiamare killWorkers da qualsiasi luogo, non solo crash o interruzioni.

+0

nota che kill -9 lascerà ancora i lavoratori in giro. Per il mio caso d'uso probabilmente è ok, ma attenzione –

+0

. 'kill -9' non accenderà nemmeno l'evento' exit' del processo; in questo caso, non sono sicuro di come lo si cattura all'interno del nodo. – cjohn