Как убить все дочерние процессы при выходе?

Как убить все дочерние процессы (порожденные с помощью child_process.spawn) при выходе из процесса node.js?

Ответ 1

Я думаю, что единственный способ - сохранить ссылку на объект 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);

Ответ 2

Чтобы добавить к @robertklep ответ:

Если, как и я, вы хотите сделать это, когда Node убивают извне, а не по собственному выбору, вам нужно сделать некоторые обманки с помощью сигналов.

Ключ должен прослушивать любой сигнал (ы), с которым вы могли быть убиты, и вызвать 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 SIGTERM (по умолчанию).

См. Этот вопрос для большего.