我找到了两个解决方案, 但都不是完美的。
1.接收SIGTERM信号后通过kill(-pid)杀死所有子进程。
显然,这个解决方案无法处理"kill -9",但对于大多数情况来说它确实可以工作并且非常简单,因为它不需要记住所有子进程。
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() {
console.log('kill process group');
process.kill(-process.pid, 'SIGKILL');
}
process.on('SIGTERM', function(err){
console.log('SIGTERM');
killMeAndChildren();
});
}
同样的方法,如果您在某个地方调用process.exit,您可以像上面提到的那样安装'exit'处理程序。
注意:Ctrl+C和突然崩溃已经被操作系统自动处理为杀死进程组,因此不再需要额外处理。
2.使用
chjj/pty.js来生成附加控制终端的进程。
无论如何都要杀死当前进程,甚至是kill -9,所有子进程也将自动被杀死(由操作系统?)。我猜这是因为当前进程持有终端的另一端,所以如果当前进程消失,子进程将收到SIGPIPE信号并死亡。
var pty = require('pty.js');
pty.spawn('any_child_process', [], {
name: 'xterm-color',
cols: 80,
rows: 30,
cwd: process.cwd(),
env: process.env
});