10

Linux サーバーでred5 サーバー(JAVA) を実行しています。

時々、サーバーがシャットダウンします。再起動しようとすると、エラーが発生しました:

「バインディング エラー、このポートはすでに使用されています」。

だから私はkillall -9 java でサーバーを強制終了しようとし、サーバーを再起動しようとします:同じエラー。

しばらく (約 2 ~ 3 分) 待ってから、もう一度再起動する必要があります。

プロセスを強制終了しても、ポート 1935 が解放されてサーバーを再度実行できるようになるまで 2 ~ 3 分待たなければならない理由を知りたいだけです。

このプロセスをすぐに強制終了してポートを解放する方法はありますか?

4

6 に答える 6

18

サーバーの古いインスタンスがポートを保持していることが確実な場合は、 を実行jpsし、リストでサーバー pid を見つけて実行します。kill -9 my_pid

一般的な非Javaプロセスの場合、lsof -i :1935通常はうまくいきます。再び、pid を取得して、このプロセスを強制終了します。

于 2010-10-16T12:55:08.993 に答える
10

問題は-9キルです。

SIGKILL (-9) を使用してプロセスを強制終了すると、プロセスはすぐに終了します。したがって、ポートは、OS が問題に気付くまで (数分後) 割り当てられたままになります。SIGKILL の前に、SIGHUP と SIGINT を (この順序で) 試してください。

いずれにせよ、netstat -a -t -pどのプロセスがポートを取得したかを確認するために使用します。

于 2010-10-16T13:04:28.397 に答える
5

可能であれば、SO_REUSEADDRプログラムがソケットをセットアップするときに socket オプションを使用する必要があります。そうすれば、プログラムが再起動されたときに、2 ~ 3 分待たずにすぐにソケットを再利用できます。

詳細については、javadoc setReuseAddressを参照してください。特に:

TCP 接続が閉じられると、接続が閉じられた後、しばらくの間、接続がタイムアウト状態のままになることがあります (通常、TIME_WAIT 状態または 2MSL 待機状態と呼ばれます)。既知のソケット アドレスまたはポートを使用するアプリケーションでは、ソケット アドレスまたはポートを含むタイムアウト状態の接続がある場合、必要な SocketAddress にソケットをバインドできない場合があります。

bind(SocketAddress) を使用してソケットをバインドする前に SO_REUSEADDR を有効にすると、前の接続がタイムアウト状態であってもソケットをバインドできます。

于 2010-10-16T12:56:12.147 に答える
1

kill -9 はデフォルトでは使用しないでください。プロセスは内部のものをクリーンアップできません。たとえば、ポート 8000 を使用してアプリケーションの pid を強制終了するには、次のようにします。

kill $(netstat -nptl | awk '/:8000/{gsub("/.*", ""); print $7}')
于 2010-10-16T13:35:39.057 に答える