首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Powershell的内存和CPU监控

基于Powershell的内存和CPU监控
EN

Stack Overflow用户
提问于 2021-04-11 20:40:28
回答 2查看 401关注 0票数 0

我试图使用powershell监控特定进程的cpu和内存使用情况。这样做的目的是安排它并让它在特定的时间间隔内得到值,然后将它们告诉.csv。

到目前为止,我遇到了两起案件:

  1. 进程只有一个进程ID。代码工作正常。进程有几个具有自己的ID的子进程。我希望它在最终输出中添加值。我对每个子进程的单个值不感兴趣(例如。但是所有子进程的累积值。

这是所需的输出:(如果一个进程有子进程,计数应该反映这一点)

代码语言:javascript
复制
Enter the name of the process to monitor: xmrig

21048
------SAMPLES------

TimeStamp    : 2021-04-11 22:32:09
InstanceName : xmrig
CookedValue  : 2289,4108563869    
Count        : 1
Sum          : 15671296

TimeStamp           InstanceName CPU % Count SumMB
---------           ------------ ----- ----- -----
2021-04-11 22:32:09 xmrig        95,39     1 14,95

他的密码是:

代码语言:javascript
复制
clear

$ProcessName = Read-Host -Prompt 'Enter the name of the process to monitor'
#Write-host $ProcessName
try{
    $ProcessId = Get-Process $ProcessName -ErrorAction Stop | select -expand id
}
catch
{
write-host ("No such process found, try again.") -ForegroundColor Red
$ProcessName = Read-Host -Prompt 'Enter the name of the process to monitor'
}

 $AllProcessIds = Get-Process $ProcessName | select -expand id
Write-Host ""
#Write-Output ("Process "+ $ProcessName + " has ID: "+ $ProcessId )
$CpuCores = (Get-WMIObject Win32_ComputerSystem).NumberOfLogicalProcessors
$CPUSamples =@()
$MEMSamples =@()
foreach ($ProcessId in $AllProcessIds){
    Write-Host $ProcessId -ForegroundColor red  
    $CPUSamples += (Get-Counter "\Process($ProcessName*)\% Processor Time").CounterSamples | Select-Object *
    $MEMSamples += Get-Process $ProcessName | Measure-Object Workingset -sum -average  
} 

<# Write-Host "------MEM SAMPLES------"
$MEMSamples
Write-Host "------CPU SAMPLES------"
$CPUSamples #>

$Samples = New-object psobject;
$Samples | Add-Member NoteProperty "TimeStamp" $CPUSamples.Timestamp;
$Samples | Add-Member NoteProperty "InstanceName" $CPUSamples.InstanceName;
$Samples | Add-Member NoteProperty "CookedValue" $CPUSamples.CookedValue;
$Samples | Add-Member NoteProperty "Count" $MEMSamples.Count;
$Samples | Add-Member NoteProperty "Sum" $MEMSamples.Sum;


Write-Host "------SAMPLES------"
$Samples

$Samples.CookedValue | ForEach-object -begin {$CookedValueSum =0} -process {$CookedValueSum+=$_} -end{}

#$Samples| Select-Object TimeStamp, InstanceName, @{Name="CPU %";Expression={[Decimal]::Round(($_.CookedValue / $CpuCores), 2)}},Count, @{Name="SumMB";Expression = {[math]::round($_.Sum/1MB,2)}} | Format-Table -AutoSize

$Samples| Select-Object TimeStamp, InstanceName, @{Name="CPU %";Expression={[Decimal]::Round(($_.CookedValueSum / $CpuCores), 2)}},Count, @{Name="SumMB";Expression = {[math]::round($_.Sum/1MB,2)}} | Format-Table -AutoSize

对如何解决这个问题有什么想法吗?有没有更简单的方法,还是我把事情弄得太复杂了?任何帮助都是非常感谢的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-11 22:34:25

我不知道你看你的帖子有什么问题。这是你想要达到的目标吗?

代码语言:javascript
复制
$Name = "svchost"
$processes = Get-Process $Name
$cpu_cores = (Get-WMIObject Win32_ComputerSystem).NumberOfLogicalProcessors

[PSCustomObject]@{
    Timestamp = (Get-Date)
    InstanceName = $Name
    Count = $processes.Count
    Memory = ($Processes.WorkingSet | Measure-Object -Sum).Sum
    CPU = "$([Math]::Round(($processes.cpu | Measure-Object -Sum).Sum / $cpu_cores, 2))%"
} | ft
代码语言:javascript
复制
Timestamp             InstanceName Count     Memory CPU  
---------             ------------ -----     ------ ---  
4/12/2021 12:27:53 AM svchost         97 2110627840 4.54%
票数 0
EN

Stack Overflow用户

发布于 2021-04-11 22:41:29

这个小小的重构怎么样。

代码语言:javascript
复制
Clear-Host

$ProcessName = 'idle'

try
{
    $ProcessId = Get-Process $ProcessName -ErrorAction Stop | 
    Select-Object -ExpandProperty id
}
catch
{
    write-host ("No such process found, try again.") -ForegroundColor Red
    $ProcessName = Read-Host -Prompt 'Enter the name of the process to monitor'
}

 $AllProcessIds = Get-Process $ProcessName | 
 Select-Object -ExcludeProperty id

$CpuCores = (Get-WMIObject Win32_ComputerSystem).NumberOfLogicalProcessors

$CPUSamples = @()
$MEMSamples = @()

foreach ($ProcessId in $AllProcessIds)
{
    $CPUSamples += (Get-Counter "\Process($ProcessName*)\% Processor Time").CounterSamples | 
    Select-Object -Property '*'

    $MEMSamples += Get-Process $ProcessName | 
    Measure-Object Workingset -sum -average  
} 


$Samples = New-object psobject

$Samples | 
Add-Member NoteProperty 'TimeStamp' $($CPUSamples.Timestamp | 
Select-Object -First 1)

$Samples | 
Add-Member NoteProperty 'InstanceName' ($CPUSamples.InstanceName | 
Select-Object -Unique)

$Samples | 
Add-Member NoteProperty 'CookedValue' $($CPUSamples.CookedValue | 
Measure-Object -Sum).Sum

$Samples | 
Add-Member NoteProperty 'Count' $MEMSamples.Count

$Samples | 
Add-Member NoteProperty 'Sum' $($MEMSamples.Sum | 
Measure-Object -Sum).Sum


Write-Host '------SAMPLES------'
$Samples

$Samples.CookedValue | 
ForEach-object -begin {$CookedValueSum =0} -process {$CookedValueSum+=$_} -end{}

$Samples | 
Select-Object TimeStamp, 
InstanceName, 
@{
    Name       = 'CPU %'
    Expression = {[Decimal]::Round(($_.CookedValueSum / $CpuCores), 2)}
},
Count, 
@{
    Name       = 'SumMB'
    Expression = {[math]::round($_.Sum/1MB,2)}
} | 
Format-Table -AutoSize

# Results
<#
------SAMPLES------


TimeStamp    : 4/11/2021 8:00:35 PM
InstanceName : explorer
CookedValue  : 0
Count        : 1
Sum          : 167120896




TimeStamp            InstanceName CPU % Count  SumMB
---------            ------------ ----- -----  -----
4/11/2021 8:00:35 PM explorer         0     1 159.38


------SAMPLES------


TimeStamp    : 4/11/2021 8:01:05 PM
InstanceName : runtimebroker
CookedValue  : 0
Count        : 3
Sum          : 262680576




TimeStamp            InstanceName  CPU % Count  SumMB
---------            ------------  ----- -----  -----
4/11/2021 8:01:05 PM runtimebroker     0     3 250.51


------SAMPLES------


TimeStamp    : 4/11/2021 8:01:26 PM
InstanceName : svchost
CookedValue  : 0
Count        : 25
Sum          : 14374760448




TimeStamp            InstanceName CPU % Count    SumMB
---------            ------------ ----- -----    -----
4/11/2021 8:01:26 PM svchost          0    25 13708.84


------SAMPLES------


TimeStamp    : 4/11/2021 8:02:10 PM
InstanceName : idle
CookedValue  : 798.371953662604
Count        : 1
Sum          : 8192




TimeStamp            InstanceName CPU % Count SumMB
---------            ------------ ----- ----- -----
4/11/2021 8:02:10 PM idle             0     1  0.01
#>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67050007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档