如何在退出时终止所有子进程?

Sir*_*ian 30 node.js

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

rob*_*lep 26

我认为唯一的方法是保持对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);
Run Code Online (Sandbox Code Playgroud)

  • @Sukima [精美手册](http://nodejs.org/api/child_process.html#child_process_child_kill_signal) 指出:*“向已经退出的子进程发送信号不是错误,但可能会产生不可预见的后果:如果PID(进程 ID)已被重新分配给另一个进程,信号将改为传递给该进程"*. 所以是的,它*可能*杀死一个不相关的进程。 (2认同)

DuB*_*sch 25

要添加到@ robertklep的答案:

如果像我一样,当Node被外部杀死而不是自己选择时,你想要这样做,你必须对信号做一些诡计.

关键是要听,你可以与被杀死的任何信号(S),并调用process.exit()默认情况下不会散发,否则节点exitprocess!

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

这样做后,就可以只听exitprocess正常.

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

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