WMIC 进程列表然后终止?
WMIC Process List and then terminate?
编辑 @aschipfl - 你的反应很完美!答案如下。
历史..
为什么要这样做? 99.9% 的时间,我们可以简单地执行以下操作:
WMIC service where "name like 'tomcat%%'" CALL stopservice
而且效果很好。然而,曾经有过这样的情况,我们 Tomcat 会留在记忆中而不是停下来。所以我们必须终止它。我必须每月一次在大约 40 台服务器上添加我们的供应商提供的 "signature" 文件,我必须 100% 确定我能够毫无问题地这样做。我们的大部分问题似乎都与 Tomcat7 和 JDK7 有一些内存调整有关。
我的批处理脚本中有以下内容,它们都很好用。
WMIC Path win32_process WHERE "CommandLine Like '%%tomcat%%'" CALL Terminate
WMIC Path win32_process WHERE "CommandLine Like '%%java%%'" CALL Terminate
但是,我真的不想终止 tomcat6w.exe 或 tomcat7w.exe。我真正想做的是终止tomcat?.exe,而不是终止:tomcat?w.exe
当我尝试以下操作时,我刚刚杀死了我的服务器 - doh!!
WMIC service where "name like 'tomcat%%'" get processid | WMIC Path win32_process WHERE "processid = processid" CALL Terminate
我认为我可以执行以下操作,但还没有成功:
for /F "skip=1" %%a in ('WMIC service where "name like 'tomcat%%'" get processid') do set pid=%%a
WMIC Path win32_process WHERE "processid = %pid%" CALL Terminate
但是,由于我正在用 tomcat 做一个通配符,我认为它正在添加一个额外的马车 return..
Ref.. 我确实在这里找到了一些有趣的信息:
http://www.dostips.com/forum/viewtopic.php?f=3&t=3815
希望这有意义吗?
回答
FOR /F "skip=1" %%a IN ('WMIC service where "name like 'tomcat%%'" get processid') DO (
FOR /F "delims=" %%b IN ("%%a") DO SET pid=%%b
)
WMIC Path win32_process WHERE "processid = %pid%" CALL Terminate
pause
谢谢!
额外的回车-return来自wmic
命令(与是否使用通配符无关)。 wmic
输出 Unicode 文本,通过 for /F
转换为 ASCII 不能完美工作。
要去掉额外的回车-return,只需将另一个 for /F
循环包裹起来:
for /F "skip=1" %%a in ('WMIC service where "name like 'tomcat%%'" get processid') do for /F "delims=" %%b in ("%%a") do set pid=%%b
所以变量pid
包含纯进程ID值。
编辑 @aschipfl - 你的反应很完美!答案如下。
历史.. 为什么要这样做? 99.9% 的时间,我们可以简单地执行以下操作:
WMIC service where "name like 'tomcat%%'" CALL stopservice
而且效果很好。然而,曾经有过这样的情况,我们 Tomcat 会留在记忆中而不是停下来。所以我们必须终止它。我必须每月一次在大约 40 台服务器上添加我们的供应商提供的 "signature" 文件,我必须 100% 确定我能够毫无问题地这样做。我们的大部分问题似乎都与 Tomcat7 和 JDK7 有一些内存调整有关。
我的批处理脚本中有以下内容,它们都很好用。
WMIC Path win32_process WHERE "CommandLine Like '%%tomcat%%'" CALL Terminate
WMIC Path win32_process WHERE "CommandLine Like '%%java%%'" CALL Terminate
但是,我真的不想终止 tomcat6w.exe 或 tomcat7w.exe。我真正想做的是终止tomcat?.exe,而不是终止:tomcat?w.exe
当我尝试以下操作时,我刚刚杀死了我的服务器 - doh!!
WMIC service where "name like 'tomcat%%'" get processid | WMIC Path win32_process WHERE "processid = processid" CALL Terminate
我认为我可以执行以下操作,但还没有成功:
for /F "skip=1" %%a in ('WMIC service where "name like 'tomcat%%'" get processid') do set pid=%%a
WMIC Path win32_process WHERE "processid = %pid%" CALL Terminate
但是,由于我正在用 tomcat 做一个通配符,我认为它正在添加一个额外的马车 return..
Ref.. 我确实在这里找到了一些有趣的信息: http://www.dostips.com/forum/viewtopic.php?f=3&t=3815
希望这有意义吗?
回答
FOR /F "skip=1" %%a IN ('WMIC service where "name like 'tomcat%%'" get processid') DO (
FOR /F "delims=" %%b IN ("%%a") DO SET pid=%%b
)
WMIC Path win32_process WHERE "processid = %pid%" CALL Terminate
pause
谢谢!
额外的回车-return来自wmic
命令(与是否使用通配符无关)。 wmic
输出 Unicode 文本,通过 for /F
转换为 ASCII 不能完美工作。
要去掉额外的回车-return,只需将另一个 for /F
循环包裹起来:
for /F "skip=1" %%a in ('WMIC service where "name like 'tomcat%%'" get processid') do for /F "delims=" %%b in ("%%a") do set pid=%%b
所以变量pid
包含纯进程ID值。