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

时间:2013-04-05 11:42:00

标签: node.js

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

2 个答案:

答案 0 :(得分:22)

添加到@ robertklep的答案:

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

关键是要监听你可能被杀死的任何信号,然后拨打FileOutputStream fos = new FileOutputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(); SerializationService serializationService = new DefaultSerializationServiceBuilder().build(); ObjectDataOutput odo = new ObjectDataOutputStream(bos, serializationService); Book book = new Book(); book.writeData(odo); bos.writeTo(fos); ,否则默认情况下节点不会在process.exit()上发出exit

process

执行此操作后,您可以正常收听var cleanExit = function() { process.exit() }; process.on('SIGINT', cleanExit); // catch ctrl-c process.on('SIGTERM', cleanExit); // catch kill 上的exit

唯一的问题是process无法被抓住,但这是设计上的问题。无论如何,你应SIGKILL kill(默认)。

有关详情,请参阅this question

答案 1 :(得分:21)

我认为唯一的方法是保留对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);