当前位置:   article > 正文

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

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这么多,我哪知道是哪个?但我们可以知道启动命令:
在这里插入图片描述

联想到linux上有ps -ef 的命令,可以查看进程对应的命令

[root@localhost ~]# ps -ef
root      5509 29889  0 16:16 pts/2    00:00:00 sleep 1
……
  • 1
  • 2
  • 3

powershell的命令没这么简单,需要使用一个很有用的命令,详解点击 Get-CimInstance

$process_id = ${get-process cmd}[0].id #查询第一条信息的进程id
$s_process = Get-CimInstance Win32_Process -Filter "ProcessId = ${process_id}"
$s_process.CommandLine
  • 1
  • 2
  • 3

上述第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
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/392344
推荐阅读
相关标签
  

闽ICP备14008679号