检测父进程何时退出

时间:2011-04-04 16:15:33

标签: node.js process watchdog

我将有一个父进程用于处理webserver重启。它将通知孩子停止收听新的请求,孩子会发信号通知家长已经停止收听,然后家长会发信号通知新孩子它可以开始收听。通过这种方式,我们可以在不到100ms的时间内完成该级别的重启(我还有一个零停机时间的孙子重启,但这并不足以重启)。

服务管理器将在关闭时终止父项。孩子如何发现父母已经结束?

使用子进程的stdin和stdout发送信号。也许我可以检测到stdin流的结束?我希望避免轮询间隔。此外,如果可能的话,我希望这是一个非常快速的检测。

4 个答案:

答案 0 :(得分:16)

一个更简单的解决方案可以是在子进程中注册“disconnect”

process.on('disconnect', function() {
  console.log('parent exited')
  process.exit();
});

答案 1 :(得分:7)

这个答案仅仅是为了提供一个entropo提出的node-ffi解决方案的例子(如上所述)(如上所述,它可以在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发出信号,这将被优雅地处理。

答案 2 :(得分:5)

您是否可以在父进程中添加一个exit listener来表示孩子?

修改
您也可以使用node-ffi (Node Foreign Function Interface)来呼叫...
prctl(PR_SET_PDEATHSIG, SIGHUP);
......在Linux中。 (man 2 prctl

答案 3 :(得分:2)

我从本机OSX应用程序中作为后台工作程序启动Node.JS。要在使用node.js stdout的父进程死亡/退出时退出node.js,我会执行以下操作:

// Watch parent exit when it dies

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

很容易就是这样,但我不确定这是否是你一直要求的; - )