我的一个应用程序中有一些死连接,如果客户端计算机死了,则该应用处于挂起状态。
->192.168.1.214:49029 (ESTABLISHED)
有没有办法在不重新启动服务器的情况下从linux命令行终止这些选项?
搜索后,我找到了名为tcpkill的解决方案。但这对我不起作用。由于它会永久阻止该IP。
我的一个应用程序中有一些死连接,如果客户端计算机死了,则该应用处于挂起状态。
->192.168.1.214:49029 (ESTABLISHED)
有没有办法在不重新启动服务器的情况下从linux命令行终止这些选项?
搜索后,我找到了名为tcpkill的解决方案。但这对我不起作用。由于它会永久阻止该IP。
Answers:
最初来自:http : //rtomaszewski.blogspot.sk/2012/11/how-to-forcfully-kill-built-tcp.html
要“杀死”套接字,必须发送TCP重置数据包。要发送它(并被另一端接受),您必须知道实际的TCP序列号。
1)已经提到的tcpkill
方法通过在网络上被动嗅探并等待此连接的有效数据包来学习SEQ号。然后,它使用获知的SEQ号将RSET数据包发送到双方。但是,如果连接处于空闲/挂起状态,并且没有数据流,它将不会做任何事情,并且将永远等待。
2)另一种方法使用称为killcx
(链接到Sourceforge)的perl脚本。这会主动发送欺骗的SYN数据包,并从答案中了解SEQ号。然后以与相同的方式发送RSET数据包tcpkill
。
另一种方法(基于您要实现的目标)是使用gdb
调试器将其附加到拥有此套接字/连接的进程,并close()
代表该进程发出syscall(如本答案中所述)。
如果您只想处理挂起的连接(另一侧已死),则存在各种超时(例如TCP keepalive),如果在系统上进行了正确配置,它们应该自动关闭此类连接。
做-作为根netstat -tunp|grep 49029
。输出的最后一列应显示负责该连接的进程的PID和程序名。
如果幸运的话,只有一个连接过程。
如果您不走运,它将变得更加复杂(PID不仅负责一个连接)。这是什么服务?
您为什么要终止该会话?