如何在命令行上获取 Windows Pid 的 cpu% 使用率?
How can I get the cpu% usage of a Windows Pid on the command line?
我知道有很多方法可以通过进程名称获取此信息,但我有许多名称相同的进程 (Java),因此需要使用 PID。
很高兴使用任何可以完成此任务的 tool/language。
最终这将使用 Cygwin 调用。
谢谢
您可以使用快速 powershell 脚本:
$searchPid = 6204
get-process | where-object Id -eq $searchPid | select-object CPU
在命令行中,你应该只需要这个:
powershell "get-process | where-object Id -eq 6204 | select-object CPU"
更新
如评论中所述,get-process returns 仅获取进程使用的 CPU 时间(以秒为单位),因此它对 CPU 的使用百分比没有帮助.看起来 WMI 调用应该为您获得该百分比:
powershell "get-wmiobject Win32_PerfFormattedData_PerfProc_Process | where-object idprocess -eq 6204 | select PercentProcessorTime"
您可以使用 psTools 尝试以下命令
pslist <pid> -s
这个 VB 脚本似乎可以解决问题,在命令行上传递 pid:
(初始 for 循环可以省略)
</p>
<pre>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) & " %"
Next
Function CPUUSage( ProcID )
On Error Resume Next
Set 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
Exit For
Next
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
Exit For
Next
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
Nc = objItem.NumberOfLogicalProcessors
Next
' CounterType - PERF_100NSEC_TIMER_INV
' Formula - (1- ((N2 - N1) / (D2 - D1))) x 100
Nd = (N2 - N1)
Dd = (D2 - D1)
' Nd/Dd = number of cores used.
' ((Nd/Dd)/Nc) * 100 = % of whole box used
PercentProcessorTime = ((Nd/Dd)/Nc)*100
CPUUSage = Round(PercentProcessorTime ,2)
End Function
例如(在 cygwin 中)如果以上内容在文件 cpu.vbs 中:
cmd /c cscript /nologo cpu.vbs 64940
我知道有很多方法可以通过进程名称获取此信息,但我有许多名称相同的进程 (Java),因此需要使用 PID。
很高兴使用任何可以完成此任务的 tool/language。
最终这将使用 Cygwin 调用。 谢谢
您可以使用快速 powershell 脚本:
$searchPid = 6204
get-process | where-object Id -eq $searchPid | select-object CPU
在命令行中,你应该只需要这个:
powershell "get-process | where-object Id -eq 6204 | select-object CPU"
更新
如评论中所述,get-process returns 仅获取进程使用的 CPU 时间(以秒为单位),因此它对 CPU 的使用百分比没有帮助.看起来 WMI 调用应该为您获得该百分比:
powershell "get-wmiobject Win32_PerfFormattedData_PerfProc_Process | where-object idprocess -eq 6204 | select PercentProcessorTime"
您可以使用 psTools 尝试以下命令
pslist <pid> -s
这个 VB 脚本似乎可以解决问题,在命令行上传递 pid:
(初始 for 循环可以省略)
</p>
<pre>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) & " %"
Next
Function CPUUSage( ProcID )
On Error Resume Next
Set 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
Exit For
Next
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
Exit For
Next
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
Nc = objItem.NumberOfLogicalProcessors
Next
' CounterType - PERF_100NSEC_TIMER_INV
' Formula - (1- ((N2 - N1) / (D2 - D1))) x 100
Nd = (N2 - N1)
Dd = (D2 - D1)
' Nd/Dd = number of cores used.
' ((Nd/Dd)/Nc) * 100 = % of whole box used
PercentProcessorTime = ((Nd/Dd)/Nc)*100
CPUUSage = Round(PercentProcessorTime ,2)
End Function
例如(在 cygwin 中)如果以上内容在文件 cpu.vbs 中: cmd /c cscript /nologo cpu.vbs 64940