我的一位同事最近遇到了一个问题,一个本应已死亡的进程仍然绑定到网络端口,从而阻止其他进程绑定到该端口。具体来说,netstat -a -b
报告称名为System
PID 4476 的进程已打开端口 60001,但至少据我所知,不存在 PID 为 4476 的进程。
进程资源管理器和任务管理器没有列出 PID 4476(尽管有另一个名为System
PID 4 的进程,它有自己的一组 TCP 连接,但不包括 60001)。 taskkill /PID 4476
还报告说找不到 PID 4476。
有没有办法杀死这个神秘的系统进程,以释放它当前绑定的端口?什么原因会导致这种情况发生?怎么会有任务管理器、进程资源管理器和 taskkill 都不知道的进程?重新启动设法解决了这个问题,但我想知道是否有办法在不重新启动的情况下解决这个问题。
答案1
我知道这是一个老话题,但万一其他人遇到同样的问题,我已经......
可能发生的情况是,您的进程在崩溃或以其他方式退出时打开了一个 TCP 端口,但未明确关闭它。通常,操作系统会清理这类东西,但只有当进程记录消失时才会清理。虽然进程可能看起来不再运行,但至少有一件事可以保留它的记录,以防止重复使用其 PID。这就是存在一个未与父进程分离的子进程。
如果您的程序在运行时生成了任何进程,请尝试终止它们。这应该会导致其进程记录被释放,并且 TCP 端口被清理。显然,Windows 在释放记录时执行此操作,而不是像我预期的那样在进程退出时执行此操作。
答案2
以管理员身份打开命令提示符
- C:\WINDOWS\system32>netstat -ano | findstr :7895
*** 重复步骤 2,直到没有子进程
C:\WINDOWS\system32>wmic 进程,其中(ParentProcessId=1091)获取 Caption,ProcessId
标题 ProcessId
命令执行程序 1328
2.a. C:\WINDOWS\system32>wmic process where (ParentProcessId=1328) 获取 Caption,ProcessId
Caption ProcessId
conhost.exe 1128
2.b. 重复此操作,直到找不到其他子进程
-- 然后杀死所有子进程
- C:\WINDOWS\system32>taskkill /F /PID 1128 成功:PID 为 9500 的进程已终止。
答案3
您是否尝试过使用 TCPView 并关闭连接?我不知道它是否会在您描述的场景中显示连接,因为我从未遇到过这种情况。但如果这种情况再次发生,这是我唯一能想到的方法。
这个过程是怎样的——是商业软件,还是自己开发的东西?似乎端口 60001 被一些特洛伊木马程序使用——我想知道它是否可能是一个 rootkit 或某种可以隐藏在操作系统之外的东西?可能需要使用 AV 对该机器进行一次彻底检查,也许可以使用可启动媒体中的某些东西。
答案4
如果您是 Windows 用户,请按照以下步骤操作步骤 1:转到此路径:控制面板\所有控制面板项\管理工具
第二步:点击服务
步骤3:停止在所需端口上运行的不需要的服务。