父进程退出时检测

我将有一个用于处理Web服务器重新启动的父进程。 它会发信号通知孩子停止收听新的请求,孩子会通知父母它已经停止收听,然后家长会发信号通知新孩子可以开始收听。 这样,我们可以完成less于100ms的停机时间,以重新启动该级别(我也有一个零宕机的孙子重启也,但这并不总是足以重新启动)。

服务pipe理器会在关机的时候杀死父母。 孩子如何检测父母已经结束?

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

你可以在父进程中放一个退出监听器来告诉孩子吗?

编辑:
您也可以使用node-ffi(节点外部函数接口)调用…
prctl(PR_SET_PDEATHSIG,SIGHUP);
在Linux中 ( man 2 prctl )

一个简单的解决scheme可以是在subprocess中注册“断开连接”

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

这个答案只是提供了一个entropo提出的node-ffi解决scheme的例子(上文提到它将在linux上工作):

这是父进程,它是产卵子,然后在5秒后退出:

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

这是subprocess(位于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来表示,这个SIGTERM将被优雅地处理。

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

 // Watch parent exit when it dies process.stdout.resume(); process.stdout.on('end', function() { process.exit(); }); 

这样简单,但我不确定是否你一直在问什么;-)

Interesting Posts