9

Web サーバーの再起動を処理するために使用される親プロセスがあります。新しいリクエストのリッスンを停止するように子に通知し、子は親にリッスンを停止したことを通知し、親は新しい子にリッスンを開始できることを通知します。このようにして、そのレベルの再起動で 100 ミリ秒未満のダウン タイムを達成できます (ゼロ ダウンタイムの孫の再起動もありますが、必ずしも十分な再起動ではありません)。

シャットダウンの時間になると、サービス マネージャーは親を強制終了します。親が終わったことを子供はどのように検出できますか?

シグナルは、子プロセスの stdin および stdout を使用して送信されます。おそらく、標準入力ストリームの終わりを検出できますか? ポーリング間隔を避けたいと思っています。また、可能であれば、これを非常に迅速に検出したいと考えています。

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 (Node Foreign Function Interface)を使用して ... prctl(PR_SET_PDEATHSIG, SIGHUP);
を呼び出す こともできます。 ... Linux で。(男 2 prctl )

于 2011-04-04T16:28:36.870 に答える
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();
});

そのように簡単ですが、それがあなたが求めていたものかどうかは正確にはわかりません;-)

于 2013-03-28T23:28:14.877 に答える