Как убить все дочерние процессы (порожденные с помощью 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
(по умолчанию).
См. Этот вопрос для большего.