我将有一个用于处理网络服务器重启的父进程。它会向孩子发出停止监听新请求的信号,孩子会向父母发出停止监听的信号,然后父母会向新的孩子发出可以开始监听的信号。通过这种方式,我们可以完成不到 100 毫秒的停机时间来重新启动该级别(我也有一个零停机时间的孙子重新启动,但这并不总是足够的重新启动)。
服务管理器将在关闭时杀死父级。孩子如何检测到父母已经结束?
使用子进程的标准输入和标准输出发送信号。也许我可以检测到标准输入流的结束?我希望避免轮询间隔。另外,如果可能的话,我希望这是一个非常快速的检测。
一个更简单的解决方案是在子进程中注册“断开连接”
process.on('disconnect', function() {
console.log('parent exited')
process.exit();
});
这个答案只是为了提供一个 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 发出信号,该信号将被优雅地处理。
您可以在父进程中放置一个退出监听器来向子进程发出信号吗?
编辑:
您还可以使用node-ffi (节点外部函数接口)来调用 ...
prctl(PR_SET_PDEATHSIG, SIGHUP);
...在 Linux 中。(男人2 prctl)
我从本地 OSX 应用程序中作为后台工作程序启动 Node.JS。为了让 node.js 在消耗 node.js stdout 的父进程死亡/退出时退出,我执行以下操作:
// Watch parent exit when it dies
process.stdout.resume();
process.stdout.on('end', function() {
process.exit();
});
就这么简单,但我不确定这是否是你一直要求的;-)