node.js进程退出时如何杀死所有子进程(使用child_process.spawn生成)?
问问题
27262 次
2 回答
35
我认为唯一的方法是保留对ChildProcess
返回的对象的引用spawn
,并在退出主进程时将其终止。
一个小例子:
var spawn = require('child_process').spawn;
var children = [];
process.on('exit', function() {
console.log('killing', children.length, 'child processes');
children.forEach(function(child) {
child.kill();
});
});
children.push(spawn('/bin/sleep', [ '10' ]));
children.push(spawn('/bin/sleep', [ '10' ]));
children.push(spawn('/bin/sleep', [ '10' ]));
setTimeout(function() { process.exit(0) }, 3000);
于 2013-04-05T12:52:02.217 回答
34
要添加到@robertklep 的答案:
如果像我一样,你想在 Node 被外部杀死时这样做,而不是它自己的选择,你必须对信号做一些诡计。
关键是监听你可能被杀死的任何信号,然后调用process.exit()
,否则默认情况下 Node 不会发出exit
on process
!
var cleanExit = function() { process.exit() };
process.on('SIGINT', cleanExit); // catch ctrl-c
process.on('SIGTERM', cleanExit); // catch kill
完成此操作后,您就可以正常收听exit
了process
。
唯一的问题是SIGKILL
无法捕获,但这是设计使然。无论如何,您应该kill
使用SIGTERM
(默认)。
有关更多信息,请参阅此问题。
于 2015-07-22T11:54:10.843 回答