如何释放死进程使端口保持打开状态?


63

我的一位同事最近遇到了一个问题,据称已死亡的进程仍然绑定到网络端口,从而阻止其他进程绑定到该端口。具体来说,netstat -a -b据报告,System以PID 4476 命名的进程的端口60001已打开,但不存在具有PID 4476的进程,至少据我所知。

进程浏览器和任务管理器未列出PID 4476(尽管还有另一个名为SystemPID 4的进程,它具有自己的一组TCP连接,其中不包括60001)。 taskkill /PID 4476还报告找不到PID 4476。

有没有办法杀死这个神秘的系统进程,以释放它当前绑定的端口?什么会导致这种情况发生?怎么会有任务管理器,进程资源管理器和taskkill不知道的进程?重新启动设法解决了这个问题,但是我想知道是否有一种方法可以在不重新启动的情况下进行修复。


您等待了多长时间才能查看端口是否已释放?连接(端口)处于什么状态?建立,关闭,等待时间?
joeqwerty 2010年

@joeqwerty:我们至少等待了15-20分钟。不幸的是,我忘记了连接处于= /状态。
亚当·罗森菲尔德

20分钟听起来像个问题。下次发生这种情况时,请运行netstat并检查连接状态,这将为您提供有关发生情况的线索。当您评论mfinni的答案时,可能是软件\服务崩溃的结果。
joeqwerty 2010年

Answers:


58

我知道这是一个旧线程,但是如果其他任何人遇到相同的问题,我也可以...

可能发生的情况是,您的进程在崩溃或以其他方式退出而未显式关闭它时打开了TCP端口。通常,操作系统会清理这些事情,但仅在过程记录消失时才会清理。尽管该进程似乎不再运行,但是至少有一件事情可以保留该进程的记录,以防止重用其PID。这是不与父进程分离的子进程的存在。

如果您的程序在运行时产生了任何进程,请尝试将其杀死。这将导致其过程记录被释放并清理TCP端口。显然,当记录被释放时,windows会这样做,而不是在进程退出时,正如我所期望的那样。


1
谢谢你,先生。我不敢相信这个答案如此之低,尤其是因为Google查询中充满了“使用TCPView /使用netstat和taskkill”的答案,在这种情况下无济于事。以我为例,帮助运行ProcessExplorer并查找任何孤立的进程是有帮助的。关闭它们可以解决问题。
gwiazdorrr 2012年

3
感谢您的提示!杀死孤儿进程确实解决了这个问题。
Darkthread

谢谢!!这正是发生在我身上的事情。我杀死了孤立的进程,并释放了端口。我不确定如何使用流程浏览器搜索孤立的流程,但是我知道生成的流程的名称,因此很容易找到。
Grezzo 2014年

1
我们遇到了同样的问题-使用Process Explorer可以看到Watson博士保留了旧的PID。我们搜索(查找)服务试图打开的端口,然后看到3-4个Dr.Watson及其正在使用的PID的条目。奇怪的是,我们不必暗中杀死任何东西。好像这个过程“唤醒了它”,它消失了。下次我们尝试重新启动服务时,它运行正常。
tresstylez 2014年

使用VS进行调试时,可能会发生类似的问题。我将VS附加到进程中,并且经过一些周期-发生了上述情况,但是我的进程(包括子进程)都没有离开。但是杀死“ vsjitdebugger”会有所帮助。
德米特里·阿扎拉耶夫'17

6

您是否尝试过使用TCPView并关闭连接?我不知道它是否会在您描述的场景中显示连接,因为我从未发生过这种情况。但这是我唯一想到的,如果再次发生这种情况。

流程是什么-是商业软件还是自制的?似乎某些木马使用了端口60001-我想知道它是否可能是rootkit或可能对操作系统隐藏的东西?可能希望通过AV来使该计算机具有良好的性能,也许是可启动媒体中的某些功能。


不,我们没有尝试TCPView;如果将来再次发生,我会牢记这一点。该软件是我们使用60001端口的内部软件-我几乎可以肯定,将端口保持打开状态的过程是我们软件的先前实例,但并没有完全消失。这阻止了该软件的另一个副本的启动。
亚当·罗森菲尔德

您的应用程序可以在绑定套接字之前将套接字的SO_REUSEADDR选项设置为true。那应该可以解决您的问题(在* nix上或多或少是强制性的)
Stephane 2010年

3

以管理员身份打开命令提示符

  1. C:\ WINDOWS \ system32> netstat -ano | 搜寻:7895

***重复步骤2,直到没有更多子进程为止

  1. C:\ WINDOWS \ system32> wmic进程,其中(ParentProcessId = 1091)获得Caption,ProcessId

    标题ProcessId

    命令程序1328

2.a. C:\ WINDOWS \ system32> wmic进程,其中(ParentProcessId = 1328)获得Caption,ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. 重复此过程,直到找不到其他子进程

-然后杀死所有子进程

  1. C:\ WINDOWS \ system32> taskkill / F / PID 1128成功:PID 9500的进程已终止。

wmic命令是我们设法确定实际上保持端口开放的子进程的唯一方法。非常感谢。
K Erlandsson '18年

这也是我发现解决问题的唯一方法。主进程消失了,子进程处于挂起状态,但仍保持TCP端口处于“侦听”状态。谢谢。

1

我之前也遇到过同样的问题,netstat -a -n Windows命令给了我带有进程ID的开放端口列表。从中我选择了想要关闭连接的端口号,然后使用TCPView软件关闭了该连接。这对我有用。


-4

如果您是Windows用户,请按照以下步骤操作:步骤1:转到此路径:控制面板\所有控制面板项目\管理工具

步骤2:点击服务

步骤3:停止在所需端口上运行的有害服务。


-5

ps -ef | grep进程名

杀死相关进程

杀死-9 pid

就我而言


6
这个问题是关于Windows,而不是Linux
longneck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.