9

我将有一个用于处理网络服务器重启的父进程。它会向孩子发出停止监听新请求的信号,孩子会向父母发出停止监听的信号,然后父母会向新的孩子发出可以开始监听的信号。通过这种方式,我们可以完成不到 100 毫秒的停机时间来重新启动该级别(我也有一个零停机时间的孙子重新启动,但这并不总是足够的重新启动)。

服务管理器将在关闭时杀死父级。孩子如何检测到父母已经结束?

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

4

4 回答 4

17

一个更简单的解决方案是在子进程中注册“断开连接”

process.on('disconnect', function() {
  console.log('parent exited')
  process.exit();
});
于 2013-05-10T17:41:41.980 回答
8

这个答案只是为了提供一个 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 发出信号,该信号将被优雅地处理。

于 2011-05-23T17:57:17.370 回答
5

您可以在父进程中放置一个退出监听器来向子进程发出信号吗?

编辑:
您还可以使用node-ffi (节点外部函数接口)来调用 ...
prctl(PR_SET_PDEATHSIG, SIGHUP);
...在 Linux 中。(男人2 prctl

于 2011-04-04T16:28:36.870 回答
2

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

// Watch parent exit when it dies

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

就这么简单,但我不确定这是否是你一直要求的;-)

于 2013-03-28T23:28:14.877 回答