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

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

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

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

有谁知道我怎样才能得到这个端口畅通无需重新启动?

 # 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 

您应该可以使用/proc/sys/net/ipv4/tcp_fin_timeout来设置超时。

实际上似乎没有办法手动清除套接字。

似乎tcp_orphan_retries设置控制在释放无服务器端口之前将完成多less次尝试。 这里是0,设置为1后,端口不见了。

HTH

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

在root ID下运行这些步骤,并清除给我:

捕获内核设置以更改variables

 $ 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内核参数重置为上面variables的原始值

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

FIN_WAIT1

本地机器上的应用程序已closures连接。 这个指示已经发送到远程机器。

您的应用程序已closures其连接的一侧,套接字现在正在等待远端确认closures。 如果在FIN_WAIT1中有很多套接字出现问题,那么你应该遵循Manni的build议。

也许tcpkill会帮助? 更多这里: http : //www.cyberciti.biz/howto/question/linux/kill-tcp-connection-using-linux-netstat.php

这可能有助于:

 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