我有一个被我需要杀死的进程阻塞的端口。 (一个小的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