FIN_WAIT1状態のソケットを削除するにはどうすればよいですか?


18

削除する必要があるプロセスによってブロックされているポートがあります。(クラッシュした小さなtelnetデーモン)。プロセスは正常に終了しましたが、ポートはまだ「FIN_WAIT1」状態です。それからは出ていません、そのタイムアウトは「10年」に設定されているようです。

ポートを解放することがわかった唯一の方法は、マシン全体を再起動することです。これは、もちろん私がやりたくないことです。

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -

再起動せずにこのポートをブロック解除する方法を知っている人はいますか?

回答:


18
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed

# restore the value of tcp_max_orphans whatever it was before. 
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# verify with 
netstat -an|grep FIN_WAIT1

2
$whateveritwas上書きする前に最初にメモすることで回答が改善されます。
16年

7

でタイムアウトを設定できるはず/proc/sys/net/ipv4/tcp_fin_timeoutです。

実際には、ソケットを手動でクリアする方法はないようです。


6
この答えは正しくありません。tcp_orphan_retriesはFIN_WAIT1に影響し、tcp_fin_timeoutはFIN_WAIT2に影響します。
suprjami

suprjamiは正しい、tcp_fin_timeoutはFIN_WAIT2に影響します。SO_LINGERを使用する場合にのみトリガーされます。
マット

@innaMこの回答を削除してください。それは正しくなく、累積投票です。あなたはまだアクティブであることがわかります。したがって、答えを削除するのが最も理にかなっているようです。
アンドリューB

@Andrew B:受け入れられた回答を削除することはできないようです。
innaM 14年

6

tcp_orphan_retriesの設定は、サーバーなしのポートが解放されるまでの試行回数を制御しているようです。ここでは0でしたが、1に設定するとポートがなくなりました。

HTH


1
密接に関連:0はデフォルトで8を意味します。serverfault.com
アンドリューB 14

5

/proc/sys/net/ipv4/tcp_fin_timeoutFIN-WAIT-1ではなく、FIN-WAIT-2状態のタイムアウトです。tcpkillルートを使用するか、キープアライブの時間を使っ/proc/sys/net/ipv4/tcp_keepalive_*てSOによる強制終了を試みてください。


2

これらの手順をルートIDで実行すると、クリアされました:

カーネル設定をキャプチャして変数を変更します

$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')

一時的に最大オーファンを0に設定します

$ sysctl -w net.ipv4.tcp_max_orphans=0

問題のあるポートが使用されていないことを確認してください

$ netstat -np|grep 9716

少し待って、上記のコマンドが行を返さないまで、必要に応じて上記の手順を繰り返します

tcp_max_orphansカーネルパラメーターをリセットして、上記の変数の元の値に戻します

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans

こんにちは、Serverfaultへようこそ。回答の書式をこのサイトの他の回答とより一致させるために、投稿を編集しました。次の回答では、ここで行ったほどタイトルを使用しないでください。他の回答を自分の回答のテンプレートとして使用することを検討してください。あなたの貢献をありがとう。サーバー障害に乗って楽しんでください。
リチャード

1

FIN_WAIT1

ローカルマシン上のアプリケーションが接続を閉じました。これの表示がリモートマシンに送信されました。

アプリケーションは接続側を閉じました。ソケットは、リモート側がその接続を確認するのを待っています。FIN_WAIT1に保持されているこれらのソケットの多くに問題がある場合は、上記のManniのアドバイスに従う必要があります。


0

Linuxカーネル4.9以上ではss、キー-Kを使用してiproute2 のコマンドを使用できます

ss -K dst 192.168.1.214 dport = 49029カーネルは、CONFIG_INET_DIAG_DESTROYオプションを有効にしてコンパイルする必要があります。

/unix//a/511691/43898経由



-4

これは役立つかもしれません:

net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 2
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0

6
それが何であるかを説明すると役立つかもしれません。私たちはプロなので、盲目的に物を貼り付けることはせず、それが役立つことを願っています。
マイケルハンプトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.