it-swarm.cn

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

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

20
Gert M
# 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
19
IdaWong

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

确实似乎没有任何手动清除套接字的方法。

7
innaM

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

高温超导

6
user64877

/proc/sys/net/ipv4/tcp_fin_timeout是FIN-WAIT-2状态的超时,而不是FIN-WAIT-1。您应该采用tcpkill路线,也可以尝试在/proc/sys/net/ipv4/tcp_keepalive_*下使用keepalive时间来强制执行SO的杀死操作。

5
Fabricio González

在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
2
Rad Mandapati

FIN_WAIT1

本地计算机上的应用程序已关闭连接。指示已发送到远程计算机。

您的应用程序已关闭其连接端,套接字现在正在等待远程端确认关闭。如果您对FIN_WAIT1中的许多套接字有问题,则应遵循上面Manni的建议。

1
Dave Cheney

在Linux内核> = 4.9上,您可以使用iproute2的ss命令,并带有密钥-K

ss -K dst 192.168.1.214 dport = 49029必须在启用CONFIG_INET_DIAG_DESTROY选项的情况下编译内核。

通过 https://unix.stackexchange.com/a/511691/43898

0
eri