Ho trovato 2 soluzioni, entrambe non perfette.
1. Uccidi tutti i bambini uccidendo (-pid) quando riceve il segnale SIGTERM.
Ovviamente, questa soluzione non può gestire "kill -9", ma funziona nella maggior parte dei casi e molto semplice perché non ha bisogno di ricordare tutti i processi figlio.
var childProc = require('child_process').spawn('tail', ['-f', '/dev/null'], {stdio:'ignore'});
var counter=0;
setInterval(function(){
console.log('c '+(++counter));
},1000);
if (process.platform.slice(0,3) != 'win') {
function killMeAndChildren() {
/*
* On Linux/Unix(Include Mac OS X), kill (-pid) will kill process group, usually
* the process itself and children.
* On Windows, an JOB object has been applied to current process and children,
* so all children will be terminated if current process dies by anyway.
*/
console.log('kill process group');
process.kill(-process.pid, 'SIGKILL');
}
/*
* When you use "kill pid_of_this_process", this callback will be called
*/
process.on('SIGTERM', function(err){
console.log('SIGTERM');
killMeAndChildren();
});
}
Allo stesso modo, puoi installare il gestore 'exit' come sopra se chiami process.exit da qualche parte. Nota: Ctrl + C e l'arresto improvviso sono stati elaborati automaticamente dal sistema operativo per eliminare il gruppo di processi, quindi non più qui.
2.Utilizzare chjj / pty.js per generare il processo con il terminale di controllo collegato.
Quando uccidi il processo corrente anche uccidendo -9, anche tutti i processi figlio verranno automaticamente uccisi (dal sistema operativo?). Immagino che, poiché il processo corrente contiene un altro lato del terminale, quindi se il processo corrente muore, il processo figlio otterrà SIGPIPE, quindi muore.
var pty = require('pty.js');
//var term =
pty.spawn('any_child_process', [/*any arguments*/], {
name: 'xterm-color',
cols: 80,
rows: 30,
cwd: process.cwd(),
env: process.env
});
/*optionally you can install data handler
term.on('data', function(data) {
process.stdout.write(data);
});
term.write(.....);
*/