Saya menemukan 2 solusi, keduanya tidak sempurna.
1.Bunuh semua anak dengan cara dibunuh (-pid) saat menerima sinyal SIGTERM.
Jelas, solusi ini tidak dapat menangani "kill -9", tetapi ia bekerja untuk sebagian besar kasus dan sangat sederhana karena tidak perlu mengingat semua proses anak.
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();
});
}
Dengan cara yang sama, Anda dapat menginstal 'keluar' handler seperti cara di atas jika Anda memanggil process.exit di suatu tempat. Catatan: Ctrl + C dan crash tiba-tiba telah secara otomatis diproses oleh OS untuk mematikan grup proses, jadi tidak ada lagi di sini.
2.Use chjj / pty.js untuk bertelur proses Anda dengan mengendalikan terminal terpasang.
Ketika Anda membunuh proses saat ini dengan cara apapun bahkan membunuh -9, semua proses anak akan secara otomatis terbunuh juga (oleh OS?). Saya kira itu karena proses saat ini memegang sisi lain terminal, jadi jika proses saat ini mati, proses anak akan mendapatkan SIGPIPE sehingga mati.
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(.....);
*/