UNIXソケットをセットアップしてプロセス間通信チャネル(ある種の監視用のもの)を公開するNodeJSアプリケーションがあります。UNIX ソケット ファイルは、os.tmpdir()
フォルダ (つまり/tmp/app-monitor.sock
) に配置されます。
var net = require('net');
var server = net.createServer(...);
server.listen('/tmp/app-monitor.sock', ...);
シグナル処理 (SIGINT、SITERM など) を使用して、サーバーを正常にシャットダウンし、ソケット ファイルを削除します。
function shutdown() {
server.close(); // socket file is automatically removed here
process.exit();
}
process.on('SIGINT', shutdown);
// and so on
私のアプリケーションは、forever start ...
ライフサイクルを監視するために実行されています。
コマンドに問題がありforever restartall
ます。永遠に行うときは、すべての子プロセスを終了するためにrestartall
a を使用しています。プロセスで処理できないため、シャットダウン手順なしでアプリが終了します。SIGKILL
SIGKILL
問題は、使用時に削除されないソケット ファイルですSIGKILL
。子プロセスが再起動された後、新しいサーバーを起動できず、listen
呼び出しによってEADDRINUSE
エラーが発生します。
アプリの起動中に既存のソケット ファイルを削除できません。実際に動作しているソケットなのか、以前のクリーンでないシャットダウンの痕跡なのかわかりません。
それで、質問は...そのような状況を処理するためのより良い方法は何ですか(SIGKILLおよびUNIXソケットサーバー)?