一个进程问题引发的有关powershell的Get-Process--进程发现与精确定位和处理的探究(windows版的ps -ef)

问题引入:
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
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值