マスターサーバーとセカンダリサーバーを開発したい。
マスター サーバーがダウンしている場合、セカンダリ サーバーは同じポートで起動する必要があります。
ただし、マスターサーバーが起動する準備ができたら、マスターサーバーが同じポートで起動できるように、セカンダリサーバーを正常に停止する必要があります。
別のプロセスが同じポートで開始しようとしていることをセカンダリサーバーが知る方法はありますか?
マスターサーバーとセカンダリサーバーを開発したい。
マスター サーバーがダウンしている場合、セカンダリ サーバーは同じポートで起動する必要があります。
ただし、マスターサーバーが起動する準備ができたら、マスターサーバーが同じポートで起動できるように、セカンダリサーバーを正常に停止する必要があります。
別のプロセスが同じポートで開始しようとしていることをセカンダリサーバーが知る方法はありますか?
サーバーを常に稼働させておく必要がある場合は、この方法に従うことができます。
ポートをリッスンして実際のサービスを実行する子を生成する親プロセスを作成します。子が実際のリクエストを処理している場合、親は in を使用waitpid
して子が死ぬ (クラッシュ/状態の変化) のを待ちC
ます。そのため、子がダウンするたびに、親は新しいプロセスを認識して生成します。-好ましいアプローチ。
特にマスターセカンダリ設計が必要な場合は、
セカンダリがリクエストを処理している場合、マスター サーバーからの信号を常に待機できます。したがって、マスターが起動している場合、その最初のタスクは、セカンダリが起動していることを検出したときにその信号をセカンダリに送信し (pid ファイル、ファイル ロック、またはバインドの失敗のいずれかによって)、セカンダリが正常に閉じることができるようにします。
プロセスが特定のポートでリッスンしようとしていることを検出する直接的な方法はないと思いますが、ptrace などのデバッガー フックや、LD_PRELOAD を使用した共有ライブラリ置換を使用して実際の試行をインターセプトする方法はありません。
ただし、ソースを変更できる場合は、1 つのプロセスが別のプロセスに通知し、親切に邪魔にならないように頼むことがかなり簡単にできます。プロセス間通信のさまざまな手段を使用してこれを行うことができます。たとえば、リッスンしているポートで接続する (セキュリティへの影響に注意してください)、別のポートで接続する (ループバック インターフェイスでのみリッスンします!)、UNIX ドメインで接続するなどです。ソケット、および他の多くの選択肢。
別のプロセスがすでにリッスンしているかどうかを確認するにはnetstat
、/proc から直接エクスポートされた情報を使用または使用して、使用中のソケットを調べることができます。
元のサーバーが SO_REUSEADDR フラグを使用していない限り、別のプロセスがそのポートを要求できるようになる前にタイムアウトが発生する可能性があることに注意してください。これは、代替ポートでバックアップを実行し、クライアントにフォールバックとしてそれを試行させることを主張するかもしれません. または、2 つのサーバーの一意のポートのいずれかへのポート フォワーダーとして機能する単純なプロセスを使用する場合。