关闭幽灵端口

背景

为了自动对公司的SVN版本库进行管理, 去年写过一个rails服务。该服务分为几个部分,其中server-code的部分运行在windows 2003 server下,  该部分服务有时会出现进程死掉的现象, 服务也无法重启。后来跟踪发现,  进程已经结束了,但是端口还存在,端口的所属进程为空, 成了幽灵端口。

 刚开始遇到这个问题时,使用TcpView 工具, 能查看到端口,但是就是无法结束.

在console下 用kill 命令终结进程,提示进程不存在。 使用netstat -ano 也正是能查看端口和进程, 也无法终结该端口。

在尝试了一些方法后发现无法解决(当然,终结方法重启机器是可以的,但是服务不允许重启),就做为一个遗留问题留了下来。

最近又遇到这个问题了, 感觉不应该越过他,就尝试解决。经过一个中午, 终于完美解决了.

原因
结束进程时,其子进程仍然存在,  子进程对该端口有依赖关系,顾端口无法释放.  
解决 
原因明确后, 我们的任务就是怎样确定哪些子进程应该关闭.
网上有人建议写程序遍历进程,发现父进程不存在的就将该进程树(不能只kill掉该进程)结束。方法虽可行,但是为了一个问题,再单独写个程序,感觉有点麻烦。  
后来想到, 我知道服务的文件夹路径, 我可以查找哪些进程占用了该文件夹下的资源。具体怎样查找,我们可以借助process explorer(非常强大的工具)。       
打开process explorer, 按ctrl + f, 在搜索框输入目标文件路径。

我们发现有下面几个进程在占用该文件夹,依次定位进程(点击查询结果的进程即可),如下图所示,我们就可以定位出进程信息。 

结束进程时,我们要在根进程结束进程树(如果单独结束某个进程,还会有幽灵进程存在,文件夹仍然被占用)。

依次结束后,我们发现端口被自动释放了。 

PS:这个解决方案还可以用来解决U 盘无法弹出。 U盘之所以无法弹出,是因为有在文件占用着它,我们可以用这个方法找出U盘的占用进程,依次结束,U判断就可以弹出了。估计360就是的U盘弹出就是使用过的该方法。  
 
参考网址
http://www.cnblogs.com/zhcncn/archive/2013/02/04/2891489.html

你可能感兴趣的:(XP,process,tcpview)