我有一个端口被一个我需要终止的进程阻塞了。(一个崩溃的小型 telnet 守护进程)。该进程已成功终止,但端口仍处于“FIN_WAIT1”状态。它没有退出,该状态的超时似乎设置为“十年”。
我发现释放端口的唯一方法是重新启动整个机器,但这当然是我不想做的。
$ netstat -tulnap | grep FIN_WAIT1
tcp 0 13937 10.0.0.153:4000 10.0.2.46:2572 FIN_WAIT1 -
有谁知道如何才能在不重启的情况下解除该端口的阻塞?
答案1
# 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
您应该能够使用 来设置超时/proc/sys/net/ipv4/tcp_fin_timeout
。
似乎确实没有任何方法可以手动清除套接字。
答案3
tcp_orphan_retries 设置似乎控制在释放无服务器端口之前将进行多少次尝试。这里是 0,将其设置为 1 后端口就消失了。
高血压
答案4
在 root 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