如何摆脱 FIN_WAIT1 状态的套接字?

Ger*_*t M 25 linux port netstat

我有一个端口被我需要杀死的进程阻止。(一个崩溃的小 telnet 守护进程)。该进程已成功终止,但端口仍处于“FIN_WAIT1”状态。它没有出来,超时似乎设置为“十年”。

我发现释放端口的唯一方法是重新启动整个机器,这当然是我不想做的事情。

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -
Run Code Online (Sandbox Code Playgroud)

有谁知道如何在不重新启动的情况下解锁此端口?

小智 23

# 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
Run Code Online (Sandbox Code Playgroud)

  • 在覆盖它之前首先记下“$whateveritwas”会改进答案。 (2认同)

inn*_*naM 7

您应该可以使用/proc/sys/net/ipv4/tcp_fin_timeout.

似乎真的没有任何方法可以手动清除套接字。

  • 这个答案是不正确的。tcp_orphan_retries 影响 FIN_WAIT1,tcp_fin_timeout 影响 FIN_WAIT2。 (6认同)

小智 6

似乎 tcp_orphan_retries 设置控制在释放无服务器端口之前将进行多少次尝试。此处为 0,将其设置为 1 后,端口消失了。

HTH


小智 5

/proc/sys/net/ipv4/tcp_fin_timeout是 FIN-WAIT-2 状态的超时,而不是 FIN-WAIT-1。您应该使用 tcpkill 路线,或者您可以尝试使用保持活动时间/proc/sys/net/ipv4/tcp_keepalive_*来强制 SO 杀死。