我将有一个父进程用于处理webserver重启。它将通知孩子停止收听新的请求,孩子会发信号通知家长已经停止收听,然后家长会发信号通知新孩子它可以开始收听。通过这种方式,我们可以在不到100ms的时间内完成该级别的重启(我还有一个零停机时间的孙子重启,但这并不足以重启)。
服务管理器将在关闭时终止父项。孩子如何发现父母已经结束?
使用子进程的stdin和stdout发送信号。也许我可以检测到stdin流的结束?我希望避免轮询间隔。此外,如果可能的话,我希望这是一个非常快速的检测。
答案 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();
});
很容易就是这样,但我不确定这是否是你一直要求的; - )