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


18

我的端口被我需要杀死的进程所阻塞。(一个崩溃的小telnet守护程序)。该进程已成功终止,但端口仍处于'FIN_WAIT1'状态。它不是不可能的,它的超时时间似乎定为“十年”。

我发现释放端口的唯一方法是重新引导整个计算机,这当然是我不想做的事情。

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

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

Answers:


18
# 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
这样可以改善答案,使其$whateveritwas在覆盖之前先做笔记。
尚未

7

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

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


6
这个答案是不正确的。tcp_orphan_retries影响FIN_WAIT1,tcp_fin_timeout影响FIN_WAIT2。
suprjami

suprjami是正确的,tcp_fin_timeout影响FIN_WAIT2。仅在使用SO_LINGER时触发。
马特

@innaM您能否删除此答案?这是不正确的,并且正在累积投票。我看到您仍然很活跃,因此删除答案似乎最有意义。
安德鲁B

@Andrew B:似乎无法删除已接受的答案。
innaM 2014年


5

/proc/sys/net/ipv4/tcp_fin_timeout是FIN-WAIT-2状态的超时,而不是FIN-WAIT-1的超时。您应该采用tcpkill路线,否则您可以尝试使用Keepalive时代/proc/sys/net/ipv4/tcp_keepalive_*来迫使SO杀死。


2

在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

嗨,欢迎来到Serverfault。我修改了您的帖子,以使答案的格式与本网站上的其他答案更加一致。对于您的下一个答案,请不要使用您在此处所使用的标题太多的内容,并考虑将其他答案作为您自己答案的模板。谢谢您的贡献。享受您在serverfault上的旅程。
理查德

1

FIN_WAIT1

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

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


0

在linux kernel> = 4.9上,您可以使用ssiproute2中的命令-K键

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

通过/unix//a/511691/43898



-4

这可能会有所帮助:

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

6
如果您解释所有内容,可能会有所帮助。我们是专业人士,因此,我们不会盲目地粘贴东西,希望能有所帮助。
迈克尔·汉普顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.