37

node.js进程退出时如何杀死所有子进程(使用child_process.spawn生成)?

4

2 回答 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 不会发出exiton process

var cleanExit = function() { process.exit() };
process.on('SIGINT', cleanExit); // catch ctrl-c
process.on('SIGTERM', cleanExit); // catch kill

完成此操作后,您就可以正常收听exitprocess

唯一的问题是SIGKILL无法捕获,但这是设计使然。无论如何,您应该kill使用SIGTERM(默认)。

有关更多信息,请参阅此问题

于 2015-07-22T11:54:10.843 回答