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

如何摆脱处于 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  -

有谁知道如何才能在不重启的情况下解除该端口的阻塞?

答案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

相关内容