【发布时间】:2013-03-27 19:35:48
【问题描述】:
node.js 进程退出时如何杀死所有子进程(使用 child_process.spawn 生成)?
【问题讨论】:
标签: node.js
node.js 进程退出时如何杀死所有子进程(使用 child_process.spawn 生成)?
【问题讨论】:
标签: node.js
添加到@robertklep 的答案:
如果像我一样,你想在 Node 被外部杀死时这样做,而不是它自己的选择,你必须对信号做一些诡计。
关键是监听你可能被杀死的任何信号,并调用process.exit(),否则默认情况下Node不会在process上发出exit!
var cleanExit = function() { process.exit() };
process.on('SIGINT', cleanExit); // catch ctrl-c
process.on('SIGTERM', cleanExit); // catch kill
这样做之后,你就可以在process上正常收听exit了。
唯一的问题是无法捕获SIGKILL,但这是设计使然。无论如何,你应该是 killing 和 SIGTERM(默认值)。
请参阅this question 了解更多信息。
【讨论】:
我认为唯一的方法是保留对spawn返回的ChildProcess对象的引用,并在退出主进程时将其杀死。
一个小例子:
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);
【讨论】:
child.kill() 时,我短暂地(直到 10 秒结束)看到三个 sleep 进程主进程停止后ps 的输出(尽管这些进程连接到 shell 的控制器终端;当我杀死 shell 时,它们就消失了)。