如果客户端机器死机,我在一个处于挂起状态的应用程序中有一些死连接。
->192.168.1.214:49029 (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)
有没有办法在不重新启动服务器的情况下从 linux 命令行终止这些选项?
搜索后,我找到了名为 tcpkill 的解决方案。但这对我不起作用。因为它永久阻止了该 IP。
小智 72
在 linux 内核 >= 4.9 上,您可以使用ss来自 iproute2的命令和密钥-K
ss -K dst 192.168.1.214 dport = 49029
Run Code Online (Sandbox Code Playgroud)
内核必须在CONFIG_INET_DIAG_DESTROY启用选项的情况下编译。
Mar*_*555 37
原文来自:http : //rtomaszewski.blogspot.sk/2012/11/how-to-forced-kill-established-tcp.html
要“杀死”套接字,您必须发送 TCP 重置数据包。要发送它(并被对方接受),您必须知道实际的 TCP 序列号。
1) 已经提到的tcpkill方法通过被动嗅探网络并等待此连接的有效数据包到达来学习 SEQ 编号。然后它使用学习到的 SEQ 号向双方发送 RSET 数据包。但是,如果连接空闲/挂起并且没有数据流,它不会做任何事情并且会永远等待。
2)另一种方法使用称为killcx(链接到 Sourceforge)的perl 脚本。这会主动发送欺骗性 SYN 数据包并从答案中学习 SEQ 编号。然后它以与 相同的方式发送 RSET 数据包tcpkill。
另一种方法(基于您想要实现的目标)是使用gdb调试器附加到拥有此套接字/连接的进程并close()代表其发出系统调用 - 如本答案中所述。
如果您只想处理挂起的连接(另一端已死),则有各种超时(例如 TCP keepalive),如果在系统上正确配置,它们应该会自动关闭此类连接。
小智 23
tcpkill可能会为你做。在 Ubuntu 中,它在dsniff包中。
就像是:
$ sudo tcpkill -i wlan0 host 192.168.1.214
Run Code Online (Sandbox Code Playgroud)
(或其他tcpdump类似的表达方式来说明要杀死的连接)。
以 root 身份执行netstat -tunp|grep 49029。输出的最后一列应显示负责该连接的进程的 PID 和程序名称。
如果幸运的话,该连接只有一个进程。
如果你不走运,它会变得更加复杂(PID 不仅仅负责那个连接)。这是什么服务?
为什么要终止该会话?
| 归档时间: |
|
| 查看次数: |
241679 次 |
| 最近记录: |