3

我有这种情况,一台装有 Windows XP 的旧计算机正在作为系统的服务器工作,并且当出现问题时有可能向我发送警报。但是,我们使用的这个服务器程序确实有问题,并且在某些特定时刻可能会停止关心警报。然后这些警报堆积起来,并在程序最终重新启动时立即全部发送。这使得这些警报毫无用处,因为当您重新启动程序时,您已经知道系统出了问题。

我针对的解决方案是 Windows 任务计划程序可以每天晚上在一个简单的批处理文件的帮助下杀死然后重新启动程序。不过,我似乎找不到杀死该进程的方法,因为该程序的进程作为 Windows 进程 csrss.exe 的子进程(子进程)运行。

如果我打开任务管理器,我可以看到该进程并杀死它,但该命令tasklist只显示父进程 csrss.exe,我需要 PID 来杀死它taskkill。是的,tasklist确实有/t杀死子进程的额外参数,但我需要一种方法来只杀死子进程,并让 Windows csrss.exe 运行显然必不可少。

所以我的问题是:有谁知道如何在批处理文件的帮助下只杀死一个子进程?

这当然可以通过为此编写一个特定的程序来完成,然后让批处理文件使用该程序,但我希望能快速修复。

到目前为止,我有:

TASKLIST /FI "IMAGENAME eq program.exe" 2>NUL | FIND /I /N "program.exe">NUL
IF NOT %ERRORLEVEL%==0 GOTO :restart
TASKKILL /FI "IMAGENAME eq program.exe" /F /T

:restart
START /D "C:\path\" program.exe

编辑:

我刚刚意识到一个进程的图像名称在任务管理器中没有缩进,因为它是另一个进程的子进程,而是因为它是一个 16 位进程(多么直观)。所以,它是一个 16 位进程,现在的问题是你如何找到一个 PID,或者以其他方式杀死一个 16 位进程。Tasklist,正如我所提到的,没有显示它,也没有显示pslist

4

1 回答 1

1

我想我设法解决了我的问题,我把这个留给任何可能遇到类似问题的人。

我试图杀死进程 ntvdm.exe ,因为它可以通过tasklistand “访问” taskkill,并且因为谷歌搜索显示它是 Windows 的虚拟机,可以让 16 位程序在 32 位系统上运行。我首先尝试在不强制的情况下杀死它,但这只杀死了 ntvdm.exe,而不是 16 位进程本身。然而,强制它似乎工作得很好,尽管我不推荐这个解决方案(出于明显的原因)在有多个基本 16 位进程运行的任何地方。

我最终使用的命令是:

TASKKILL /FI "IMAGENAME eq ntvdm.exe" /F /T
于 2012-11-02T15:51:06.493 回答