使用kill -9 杀死进程后,连接端口没有被释放。

莫小懒 2013-03-18 04:31:46
在服务端有一个报文交换器进程,连接比较频繁。
停止的时候使用kill -9 pid的方式杀死进程后,进程所占用的端口没有释放,而是进入fin_wait1或者close_wait状态。需要等待一段时间后才能释放连接。

疑问kill -9 不是强制杀死进程吗?怎么还会有连接存在?
有没有办法比较快的释放这些端口?
...全文
5460 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
就想叫yoko 2014-08-28
  • 打赏
  • 举报
回复
close_wait是对端关了,你没关 fin_wait1是你关了对端没关。 你都kill -9了,我想你比较关心的是程序重启后再去bind所监听的端口失败的问题吧 加SO_REUSEADDR
mhpmii 2014-08-28
  • 打赏
  • 举报
回复
我的程序也出现CLOSE_WAIT 了,不过是运行的过程中产生的,kill掉程序之后就会自己消失的,不用等的,我杀进程一般不用kill -9
影子传说_Hades 2014-08-27
  • 打赏
  • 举报
回复
TCP/IP关闭的四次握手导致,kill -9 程序后,程序没有close Socket 经过2 M S L时间才会释放Socket端口 如果使用处于2 M S L等待端口的主机出现故障,它会在M S L秒内重新启动,并立即使用故 障前仍处于2 M S L的插口对来建立一个新的连接吗?如果是这样,在故障前从这个连接发出而 迟到的报文段会被错误地当作属于重启后新连接的报文段。无论如何选择重启后新连接的初 始序号,都会发生这种情况。 为了防止这种情况,RFC 793指出T C P在重启动后的M S L秒内不能建立任何连接。这就称 为平静时间(quiet time)。
影子传说_Hades 2014-08-27
  • 打赏
  • 举报
回复
楼主阅读一下 TCP/IP 详解 I 的第18章就知道了 T I M E WA I T状态也称为2 M S L等待状态。每个具体T C P实现必须选择一个报文段最大生存时间M S L(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。在连接处于2 M S L等待时,任何迟到的报文段将被丢弃。因为处于2 M S L等待的、由该插口对(socket pair)定义的连接在这段时间内不能被再用,因此当要建立一个有效的连接时,来 自该连接的一个较早替身( i n c a r n a t i o n)的迟到报文段作为新连接的一部分不可能不被曲解 (一个连接由一个插口对来定义。一个连接的新的实例( i n s t a n c e)称为该连接的替身)。
wangzhaoyang121 2013-03-27
  • 打赏
  • 举报
回复
引用 4 楼 qq120848369 的回复:
SO_REUSEADDR就行了.
++1。 进入fin_wait1或者close_wait状态是TCP连接的一种保护机制,你可以看一下《UNix网络编程》的TCP连接终止部分;
莫小懒 2013-03-20
  • 打赏
  • 举报
回复
引用 5 楼 Idle_Cloud 的回复:
close_wait 的资源貌似 SO_REUSEADDR也不能避免,不是杀死进程导致,是使用socket不当哦。
可以请教一下可能是什么样的使用不当吗?
莫小懒 2013-03-20
  • 打赏
  • 举报
回复
引用 2 楼 zodiac1111 的回复:
个人见解: 1.被强制结束的进程资源是操作系统回收的,不好(能)控制. 无奈之举 2.最好发送正常停止(不是强制结束)信号,软件退出中处理(释放资源). 这样才是好软件 :) 具体信号意义自己搜索一下.强制须谨慎. 不准确的表述请各位前辈轻拍.引用让我知道,谢谢:)
请问发送Kill -9 和正常停止信号对程序来说有什么比较大的区别呢? 因为不是很明白kill指令后进程应该是一个怎么样的杀死过程……?
Carl_CCC 2013-03-20
  • 打赏
  • 举报
回复
引用 7 楼 r270072364 的回复:
引用 5 楼 Idle_Cloud 的回复:close_wait 的资源貌似 SO_REUSEADDR也不能避免,不是杀死进程导致,是使用socket不当哦。 可以请教一下可能是什么样的使用不当吗?
比如你接受连接后又会产生新的描述符,这些资源关闭了没啊。
Carl_CCC 2013-03-19
  • 打赏
  • 举报
回复
close_wait 的资源貌似 SO_REUSEADDR也不能避免,不是杀死进程导致,是使用socket不当哦。
qq120848369 2013-03-18
  • 打赏
  • 举报
回复
SO_REUSEADDR就行了.
沭水河畔 2013-03-18
  • 打赏
  • 举报
回复
Windows下有API可以关掉一条TCP连接,SetTcpEntry()。Sysinternals里的tcpviewer.exe就是这么做的。 不知Linux有没有类似的API,如果没有的话,可以模拟客户端发一个RST包试试。
zodiac1111 2013-03-18
  • 打赏
  • 举报
回复
个人见解: 1.被强制结束的进程资源是操作系统回收的,不好(能)控制. 无奈之举 2.最好发送正常停止(不是强制结束)信号,软件退出中处理(释放资源). 这样才是好软件 :) 具体信号意义自己搜索一下.强制须谨慎. 不准确的表述请各位前辈轻拍.引用让我知道,谢谢:)
xinhua0910 2013-03-18
  • 打赏
  • 举报
回复
关注

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧