赞
踩
问题引入:
windows的tomcat前台启动都会启动一个cmd窗口
对应一个任务,至少包含一个cmd进程,一个java进程
如果使用命令结束java进程,则tomcat随即停止,然后手动关闭cmd窗口即可结束所有进程。
!!!但是,如果tomcat是后台启动,则没有cmd窗口,但对应的cmd进程还是存在的,然而不能通过关闭cmd窗口的方式结束cmd进程,该cmd进程会占用tomcat的启动资源(根据现象推测),如果tomcat的启动参数里内存超过系统内存的一半,则就会因为资源不足而无法再次启动tomcat!!
要解决这个问题就是要关闭这个cmd进程。
首先,查看cmd的进程
PS C:\> get-process cmd
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
145 9 3340 6260 0.02 7736 1 cmd
167 11 4116 6416 0.02 17808 0 cmd
146 10 3236 5996 0.08 31196 1 cmd
这么多,我哪知道是哪个?但我们可以知道启动命令:
联想到linux上有ps -ef 的命令,可以查看进程对应的命令
[root@localhost ~]# ps -ef
root 5509 29889 0 16:16 pts/2 00:00:00 sleep 1
……
但powershell的命令没这么简单,需要使用一个很有用的命令,详解点击 Get-CimInstance
$process_id = ${get-process cmd}[0].id #查询第一条信息的进程id
$s_process = Get-CimInstance Win32_Process -Filter "ProcessId = ${process_id}"
$s_process.CommandLine
上述第3条命令的结果即为进程的命令
然后,便利一下:
$plist = get-process "cmd" -errorAction ignore
$_PID_TEXT="\jre\bin\javaw"
foreach ($process in $plist){
$process_id = $process.id
$process_id
$sub_process = Get-CimInstance Win32_Process -Filter "ProcessId = ${process_id}"
if($sub_process.CommandLine.contains(${_PID_TEXT})){
# do something
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。