我有一个端口被我需要杀死的进程阻塞。(一个崩溃的小 telnet 守护进程)。该进程已成功终止,但端口仍处于“FIN_WAIT1”状态。它并没有出现,它的超时似乎设置为“十年”。
我发现释放端口的唯一方法是重新启动整个机器,这当然是我不想做的事情。
$ netstat -tulnap | grep FIN_WAIT1
tcp 0 13937 10.0.0.153:4000 10.0.2.46:2572 FIN_WAIT1 -
有谁知道如何在不重新启动的情况下解锁此端口?
您应该可以使用 设置超时
/proc/sys/net/ipv4/tcp_fin_timeout
。似乎没有任何方法可以手动清除套接字。
似乎 tcp_orphan_retries 设置控制在释放无服务器端口之前将进行多少次尝试。此处为 0,将其设置为 1 后端口消失了。
高温高压
/proc/sys/net/ipv4/tcp_fin_timeout
是 FIN-WAIT-2 状态的超时时间,而不是 FIN-WAIT-1。您应该使用 tcpkill 路线,或者您可以尝试使用下面的 keepalive 时间/proc/sys/net/ipv4/tcp_keepalive_*
来强制 SO 杀死。在根 ID 下运行这些步骤,它为我清除了:
捕获内核设置以更改变量
暂时将最大孤儿设置为 0
检查以确保不再使用有问题的端口
稍等一下,如果需要,重复上面的步骤,直到上面的命令没有返回任何行
从上面的变量中将 tcp_max_orphans 内核参数重置为原始值
您的应用程序已经关闭了它的连接端,套接字现在正在等待远程端确认关闭。如果您对FIN_WAIT1中的许多套接字有疑问,那么您应该遵循上面 Manni 的建议。
在 Linux 内核 >= 4.9 上,您可以使用
ss
iproute2 中的命令和键 -Kss -K dst 192.168.1.214 dport = 49029 必须在启用 CONFIG_INET_DIAG_DESTROY 选项的情况下编译内核。
通过https://unix.stackexchange.com/a/511691/43898
也许 tcpkill 会有所帮助?更多信息:http: //www.cyberciti.biz/howto/question/linux/kill-tcp-connection-using-linux-netstat.php
这可能会有所帮助: