Her ikisi de mükemmel olmayan 2 çözüm buldum.
1. SIGTERM sinyali alındığında tüm çocukları öldürerek öldürün (-pid).
Açıkçası, bu çözüm "kill -9" işleyemez, ancak çoğu durumda işe yarar ve çok basit çünkü tüm çocuk süreçlerini hatırlamak gerekmez.
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();
});
}
Aynı şekilde, process.exit'i bir yere çağırırsanız, yukarıdaki gibi 'exit' işleyicisini yükleyebilirsiniz. Not: Ctrl + C ve ani çökme, işlem grubunu öldürmek için işletim sistemi tarafından otomatik olarak işlendi, bu yüzden burada daha fazla yok.
2.Use chjj / pty.js bağlı uç kontrol ederek için yumurtlamaya süreç.
Mevcut işlemi zaten -9'u öldürdüğünüzde öldürdüğünüzde, tüm alt süreçler de otomatik olarak öldürülecektir (OS tarafından?). Sanırım mevcut süreç terminalin başka bir tarafını tutuyor, bu nedenle eğer mevcut süreç ölürse, alt süreç SIGPIPE'yi alır ve böylece ölür.
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(.....);
*/