【问题标题】:Killing a Windows 16-bit process from a batch file从批处理文件中杀死 Windows 16 位进程
【发布时间】:2012-10-22 13:07:28
【问题描述】:

我有这样的情况,一台装有 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 也没有。

【问题讨论】:

  • 您需要回答的问题是“为什么任务列表没有向我显示该过程?”它是16位进程吗?你试过用 pslist 代替 tasklist 吗?
  • 是的,它是一个 16 位进程 - 这就是为什么任务列表没有显示任何内容?有没有办法也显示 16 位进程?我尝试安装 pstools,和 pslist 一起安装,但它也找不到进程。
  • 我不知道有没有预制的东西,但these应该是管理在NT系列Windows版本下运行的16位任务的相关API。
  • 谢谢你,马特奥。不过,我认为问题是通过强制终止名为 ntvdm.exe 的进程自行解决的。但万一还是有问题,我会试一试。

标签: windows batch-file kill kill-process child-process


【解决方案1】:

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

我试图杀死进程 ntvdm.exe,因为它可以被 tasklisttaskkill “访问”,并且因为谷歌搜索显示它是允许 16 位程序运行的 Windows 虚拟机32 位系统。我首先尝试在不强制的情况下杀死它,但这只杀死了 ntvdm.exe,而不是 16 位进程本身。然而,强制它似乎可以正常工作,尽管我不建议在运行多个基本 16 位进程的任何地方使用此解决方案(出于显而易见的原因)。

我最终使用的命令是:

TASKKILL /FI "IMAGENAME eq ntvdm.exe" /F /T

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多