2017-12-05 25 views
0

こんにちは、クラスタモジュールを使用しているときに信号処理のソースコードはどこにありますか?私はSIGTERMを扱いたいので、httpサーバを "優雅"に閉じることができますが、マスタープロセスがこのシグナルを受信すると、httpサーバはリッスンを停止します。クラスタモジュールを使用したSIGTERMの処理

"終了" ハンドラが(この関数は、呼び出されたときにSIGTERMまたはSIGINT)

function handleTermination(httpServer?: http.Server) { 
    if (Store.receive<symbol, boolean>(STORE_KEYS.isTerminating)) { 
     return 
    } 

    Store.store<symbol, boolean>(STORE_KEYS.isTerminating, true) 

    if (httpServer) { 
     if (!httpServer.listening || isDevelopment) { 
      closeAll() 
      process.exit(0) 
      return 
     } 

     setTimeout(() => { 
      if (process.env.GRACEFUL_SHUTDOWN !== undefined) { 
       gracefulCloseSockets() 
      } 

      httpServer.close(endProcess) 
     }, 5000) 
    } else { 
     endProcess() 
    } 
} 

例ルータハンドラ

function timerHandler(_req: RequestObject, respond: ResponseHandler) { 
    setTimeout(() => respond('ok'), 2000) 
} 

答えて

0

私は私の問題を解決しました。私の問題を解決したコードは次のとおりです。マスターが "SIGTERM" を受信すると

master.js

function close(callback) { 
    if (!cluster.isMaster) { 
    return 
    } 

    const promiseArray = [] 
    const workerIds = Object.keys(cluster.workers) 

    for (const workerId of workerIds) { 
    const worker = cluster.workers[workerId] 

    worker.send('shutdown') 
    worker.disconnect() 

    promiseArray.push(new Promise((resolve) => { 
     let resolved = false 

     worker.once('exit',() => (!resolved && resolve(), resolved = true)) 
     setTimeout(() => (!resolved && resolve(), worker.kill('SIGTERM'), resolved = true), 4000) 
    })) 
    } 

    Promise.all(promiseArray).then(callback) 
} 

worker.js

function terminateWorker(server) { 
    if (server && server.listening) { 
    Store.store(STORE_KEYS.isTerminating, true) 
    gracefulCloseSockets() 
    server.close(endProcess) 
    } else { 
    endProcess() 
    } 
} 

説明

  1. は彼が呼び出されますclose機能(上の抜粋)
  2. 作業者は「シャットダウン」メッセージを受信し、terminateWorker機能を呼び出します(上記の抜粋)。この関数はhttp.Serverを閉じ、すべてのソケットが終了するのを待ちます。
0

どうprocess.on( "出口"、CB)またはプロセスに関する。 on( "beforeExit"、cb)?

+0

ありがとうございます、ありがとうございます、私はこれを確認して報告します。 – Siggy

+0

これらのイベントを使用すると、httpサーバーはすでに閉じられています。これは私が達成したいことではありません。 – Siggy

関連する問題