Определить, когда родительский процесс выходит - PullRequest
7 голосов
/ 04 апреля 2011

У меня будет родительский процесс, который используется для обработки перезапусков веб-сервера. Он подаст сигнал ребенку прекратить прослушивание новых запросов, потомок проинформирует родителя о том, что он перестал прослушивать, затем родитель проинформирует нового потомка о том, что он может начать прослушивание. Таким образом, мы можем достичь времени простоя менее 100 мс для перезапуска этого уровня (у меня есть перезапуск внука с нулевым временем простоя, но этого не всегда достаточно для перезапуска).

Диспетчер служб уничтожит родителя, когда придет время выключения. Как ребенок может определить, что родитель закончил?

Сигналы отправляются с использованием stdin и stdout дочернего процесса. Возможно, я смогу определить конец потока stdin? Я надеюсь избежать интервала опроса. Кроме того, я хотел бы, чтобы это было действительно быстрое обнаружение, если это возможно.

Ответы [ 4 ]

16 голосов
/ 10 мая 2013

более простое решение может быть, если зарегистрировать «отключение» в дочернем процессе

process.on('disconnect', function() {
  console.log('parent exited')
  process.exit();
});
7 голосов
/ 23 мая 2011

Этот ответ только для того, чтобы предоставить пример решения node-ffi, которое предложило entropo (выше) (как уже упоминалось, оно будет работать на linux):

это родительский процесс, он порождает дочерний процесс и затем завершается через 5 секунд:

var spawn = require('child_process').spawn;
var node = spawn('node', [__dirname + '/child.js']);
setTimeout(function(){process.exit(0)}, 5000);

это дочерний процесс (находится в child.js)

var FFI = require('node-ffi');
var current = new FFI.Library(null, {"prctl": ["int32", ["int32", "uint32"]]})

//1: PR_SET_PDEATHSIG, 15: SIGTERM
var returned = current.prctl(1,15);

process.on('SIGTERM',function(){
        //do something interesting
        process.exit(1);
});

doNotExit = function (){
        return true;
};
setInterval(doNotExit, 500);

без current.prctl (1,15) ребенок будет работать вечно, даже если родитель умирает. Здесь это будет сигнализироваться с SIGTERM, который будет обработан изящно.

5 голосов
/ 04 апреля 2011

Не могли бы вы просто вставить обработчик выхода в родительский процесс, который сигнализирует дочерним процессам?

Редактировать:
Вы также можете использовать узел-ffi (интерфейс внешних функций узла) для вызова ...
prctl (PR_SET_PDEATHSIG, SIGHUP);
... в Linux.( man 2 prctl )

2 голосов
/ 29 марта 2013

Я запускаю Node.JS из собственного OSX-приложения в качестве фонового рабочего.Чтобы заставить node.js завершиться, когда родительский процесс, который использует stdout node.js, умирает / выходит, я делаю следующее:

// Watch parent exit when it dies

process.stdout.resume();
process.stdout.on('end', function() {
  process.exit();
});

Просто, но я не совсем уверен, что это то, что вы 'я просил; -)

...