【问题标题】:How can I get the cpu% usage of a Windows Pid on the command line?如何在命令行上获取 Windows Pid 的 cpu% 使用率?
【发布时间】:2016-09-06 06:02:25
【问题描述】:

我知道通过进程名称获取此信息的许多方法,但我有许多具有相同名称的进程 (Java),因此需要使用 PID。

乐于使用任何可以完成此任务的工具/语言。

最终这将使用 Cygwin 调用。 谢谢

【问题讨论】:

标签: java windows cpu pid


【解决方案1】:

这个 VB 脚本似乎可以解决问题,在命令行上传递 pid: (初始的 for 循环可以省略)

For Each Process in GetObject("winmgmts:").ExecQuery("Select * from Win32_Process where Handle = " & WScript.Arguments.Item(0) & "")
 WScript.echo Process.Handle & " " & Process.name & " " & CPUUSage(Process.Handle) & " %"
下一个

函数 CPUUSage( ProcID )
  出错时继续下一步

设置 objService = GetObject("Winmgmts:{impersonationlevel=impersonate}!\Root\Cimv2")

For Each objInstance1 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
    N1 = objInstance1.PercentProcessorTime
    D1 = objInstance1.TimeStamp_Sys100NS
    退出
下一个

 WScript.Sleep(2000)

For Each perf_instance2 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
    N2 = perf_instance2.PercentProcessorTime
    D2 = perf_instance2.TimeStamp_Sys100NS
    退出
下一个

常量 wbemFlagReturnImmediately = &h10
常量 wbemFlagForwardOnly = &h20
strComputer =“。”

设置 objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
设置 colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", _
                                      wbemFlagReturnImmediately + wbemFlagForwardOnly)

对于 colItems 中的每个 objItem
    Nc = objItem.NumberOfLogicalProcessors
下一个

' 计数器类型 - PERF_100NSEC_TIMER_INV
' 公式 - (1- ((N2 - N1) / (D2 - D1))) x 100
Nd = (N2 - N1)
Dd = (D2 - D1)
' Nd/Dd = 使用的核心数。
' ((Nd/Dd)/Nc) * 100 = 使用的整个盒子的百分比
PercentProcessorTime = ((Nd/Dd)/Nc)*100

CPUUSage = Round(PercentProcessorTime ,2)
结束功能

例如(在 cygwin 中)如果上述内容在文件 cpu.vbs 中: cmd /c cscript /nologo cpu.vbs 64940

【讨论】:

    【解决方案2】:

    您可以使用 psTools 尝试以下命令

    pslist <pid> -s 
    

    【讨论】:

    • 这给出了 CPU 时间和经过的时间,而不是 cpu %
    【解决方案3】:

    您可以使用快速的 powershell 脚本:

    $searchPid = 6204
    get-process | where-object Id -eq $searchPid | select-object CPU
    

    在命令行,你应该只需要这个:

    powershell "get-process | where-object Id -eq 6204 | select-object CPU"
    

    更新

    如 cmets 中所述,get-process 仅返回进程已使用的 CPU 时间(以秒为单位),因此它对 CPU 的使用百分比没有帮助。看起来 WMI 调用应该为您获得该百分比:

    powershell "get-wmiobject Win32_PerfFormattedData_PerfProc_Process | where-object idprocess -eq 6204 | select PercentProcessorTime"
    

    【讨论】:

    • 谢谢 - 在 CPU 标题下给出了一个值 - 这代表什么?我正在查看的 Java 进程处于空闲状态,上述脚本给出的值为 1123.328...
    • 好电话 - 我之前曾将 cmdlet 用于其他目的,但没有意识到这不是 CPU 百分比。 Per TechNet - “进程在所有处理器上使用的处理器时间,以秒为单位。”,所以让我找到一个更好的 cmdlet/调用来使用。对此感到抱歉。
    • 谢谢 - 这是 1 个核心的百分比还是所有核心?我不确定这个值是否正确 - 根据任务管理器,我有一个正在使用 40+% 的正在运行的进程,但上面的命令似乎固定在 100
    • 我相信这是所有核心的总数,但您可以通过运行它来检查非“_total”条目的结果是否加起来为 100 或 100 *(核心数)
    • 抱歉,不确定您所说的非“_total”条目是什么意思
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2014-03-25
    相关资源
    最近更新 更多