我遇到这种情况,一台装有Windows XP的旧电脑正在作为系统的服务器工作,并且当出现问题时可以向我发送警报。但是,我们使用的这个服务器程序实际上是错误的,并且可以在某个特定时刻停止关注警报。这些警报然后堆积起来,并在程序最终重新启动时立即发送所有警报。这使得这些警报毫无用处,因为当您重新启动程序时,您已经知道系统出了问题。
我的目标解决方案是Windows任务计划程序可以每晚杀死然后在一个简单的批处理文件的帮助下重启程序。我似乎无法找到杀死进程的方法,因为程序的进程是作为Windows进程csrss.exe的子进程(子进程)运行的。
如果我打开任务管理器,我可以看到该进程并将其终止,但命令tasklist
仅显示父进程csrss.exe,我需要PID以taskkill
将其终止。是的,tasklist
确实有额外的参数/t
来杀死子进程,但是我需要一种方法来杀死子进程,并且显然必须运行Windows csrss.exe。< / p>
所以我的问题是:有人知道如何在批处理文件的帮助下杀死子进程吗?
这当然可以通过为此编写特定程序来完成,然后让批处理文件使用该程序,但我希望能够快速修复。
到目前为止,我有:
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
也没有。
答案 0 :(得分:0)
我想我已经设法解决了我的问题,我将这里留给任何可能遇到类似问题的人。
我尝试杀死进程ntvdm.exe,因为tasklist
和taskkill
“可以访问”,因为谷歌搜索显示它是Windows的虚拟机,让16-位程序在32位系统上运行。我首先试图杀死它而不强制它,但这只会杀死ntvdm.exe,而不是16位进程本身。然而,强制它似乎没有问题,但我不推荐这个解决方案(出于显而易见的原因)在任何有多个基本16位进程运行的地方。
我最终使用的命令是:
TASKKILL /FI "IMAGENAME eq ntvdm.exe" /F /T