关于node.js:如何在退出时终止所有子进程?

How to kill all child processes on exit?

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


添加到@robertklep的答案:

如果像我一样,当节点被外部杀死时,你想这样做,而不是自己选择,你必须用信号来做一些欺骗。

关键是要监听您可能被杀死的任何信号,并调用process.exit(),否则默认情况下节点不会在process上发出exit

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

这样做之后,您就可以正常地听process上的exit

唯一的问题是SIGKILL无法捕获,但这是由设计造成的。无论如何,你应该是killSIGTERM(违约)。

请参阅此问题了解更多信息。


我认为唯一的方法是保持对spawn返回的ChildProcess对象的引用,并在退出主进程时杀死它。

一个小例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);