Windows Powershell的Linux“ Top”命令?


61

我正在寻找可以提供与Linux Top应用类似功能的PowerShell cmdlet。某些东西会以给定的间隔刷新,并显示带有CPU%util的进程列表。

我见过一些脚本,这些脚本列出了循环中的CPU使用率百分比,但由于我们已经设置了用于管理的SSH / Powershell访问权限,因此像top这样的脚本会更方便(我仍然更喜欢使用腻子外壳!)


这恰好属于superuser.com的问题类别。

酷-didnt意识到该网站甚至存在!(我主要是C#开发人员)

3
进程对象上的CPU属性不是CPU百分比,而是自进程启动以来的总CPU时间。

Answers:


36
While(1) {ps | sort -des cpu | select -f 15 | ft -a; sleep 1; cls}

这是一种简单的衬纸,也可以将标签保持在顶部。

之所以可行,是因为不使用任何参数格式化表格只会绘制默认表格。autosize用于自动调整列宽,以便所有数据都可以显示在屏幕上。

这是使用的缩短命令的明细

  • select -f是-first的快捷方式
  • ft是Format-Table的快捷方式
  • -a是-autosize的快捷方式
  • 睡眠默认为使用秒

2
CPUin ps是总使用时间的秒数,不是%CPU。因此,它不是那么有用。
Artyom

26

我对单个cmdlet形式一无所知,但是就像您说的那样,脚本易于编写以模仿top。

while (1) { ps | sort -desc cpu | select -first 30; sleep -seconds 2; cls }

足够接近-我可以从这里进行调整...好了!(我是C#开发人员,但也管理我们的服务器-因此,将PowerShell曲线

如果您想了解更多信息(例如),请访问www.poshcode.org
2010年

@TimAtVenturality-您可以将脚本包装为带有参数的函数,以更紧密地复制top。
Joe Internet

16

与其他解决方案类似的解决方案,但使用Get-Counter而不是Get-Process。

While(1) { $p = get-counter '\Process(*)\% Processor Time'; cls; $p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}

样本输出:

Path                                                      InstanceName              CookedValue
----                                                      ------------              -----------
\\server_name\process(_total)\% processor time                 _total               4806.03969127454
\\server_name\process(idle)\% processor time                   idle                 1103.7573538257
\\server_name\process(program#2)\% processor time              program              749.692930701698
\\server_name\process(program#5)\% processor time              program              563.424255927765
\\server_name\process(program#1)\% processor time              program              535.714866291973
\\server_name\process(program#6)\% processor time              program              455.665518455242
\\server_name\process(program#3)\% processor time              program              426.416718284128
\\server_name\process(program)\% processor time                program              395.628507577693
\\server_name\process(program#4)\% processor time              program              335.591496700144
\\server_name\process(microsoftedgecp#2)\% processor time      microsoftedgecp      129.310484967028
\\server_name\process(system)\% processor time                 system               80.0493478367316
\\server_name\process(chrome#8)\% processor time               chrome               1.53941053532176

我发现这里使用get-process报告的大多数其他解决方案都报告了自该进程开始以来的总CPU时间。这对我的服务器保持24/7的速度无济于事,在该服务器上,最高的结果始终是公正的,svchost并且运行system时间为数百万秒。True top或Task Manager等效项将提供最近在某个固定时间内记录的CPU使用情况的快照,Get-Counter会提供该快照。由于该超级用户的帖子仍然是“ powershell top”在Google上排名最高的结果,因此我认为这种选择值得一提。

我的命令基于Get-Counter文档中的示例13:https : //docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Diagnostics/Get-Counter
这是单线的细分,因此您可以更轻松地根据需要进行修改:

  • While(1) { 只是循环
  • get-counter '\Process(*)\% Processor Time'选择CPU%数据。此命令似乎需要大量时间才能返回,因此无需sleep
  • cls 清除新表
  • sort -des CookedValue CookedValue是我们最感兴趣的领域,可以将最大的领域放在首位
  • select -f 15 显示前15个
  • ft -a 显示在格式化表格中

4
这是最好的答案:Get-Counter为您提供“瞬时” CPU,而不是从开始的累积CPU时间ps更好的格式Get-Counter '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples| Select-Object -Property instancename, cookedvalue| ? {$_.instanceName -notmatch "^(idle|_total|system)$"} | Sort-Object -Property cookedvalue -Descending| Select-Object -First 25| ft InstanceName,@{L='CPU';E={($_.Cookedvalue/100/$env:NUMBER_OF_PROCESSORS).toString('P')}} -AutoSize
pjhsea

6

每次更新都在顶部提供漂亮的标题,而无需清除整个控制台。

$saveY = [console]::CursorTop
$saveX = [console]::CursorLeft      

while ($true) {
    Get-Process | Sort -Descending CPU | Select -First 30;
    Sleep -Seconds 2;
    [console]::setcursorposition($saveX,$saveY+3)
}

5

我不知道提供该功能的PowerShell cmdlet。有一个免费软件的外部命令可以满足您的需求。查看Sysinternals套件中Mark Russinovich的pslist。Pslist在可配置视图中提供了正在执行的进程的列表。“ pslist -s”提供所需的连续更新,默认刷新速率为每秒一次。

我更喜欢使用Mark的GUI Process Explorer,但是pslist对于控制台会话很方便。

Sysinternals主页在这里:http : //technet.microsoft.com/zh-cn/sysinternals

丹尼斯


2
while (1) {ps | sort -desc cpu | select -first 30; 
sleep -seconds 2; cls; 
write-host "Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName"; 
write-host "-------  ------    -----      ----- -----   ------     -- -----------"}

这只是一种更好的方法,因为您每次都可以看到标题


1

另外,我想指出的是,如果您想要Windows的类似Linux的环境,则可以使用Cygwin。它将Linux环境带到Windows。您几乎可以使用所有命令。不确定这对您有多有用。

http://www.cygwin.com/


1

这也可以解决问题:

function htopish {
  Param (
    [Parameter(Position=1)] [Alias("l")]
    [int]$TotalList=24,
    [Parameter(Position=2)] [Alias("r")]
    [int]$Invertal=1
  )
  Begin {}
  Process {
    While ($true) {
      $CounterSamples = Get-Counter '\Process(*)\ID Process','\Process(*)\% Processor Time','\Process(*)\Working Set' | Select-Object -Expand CounterSamples
      Clear-Host
      $CounterSamples | Group-Object { Split-Path $_.Path } | Where-Object {$_.Group[1].InstanceName -notmatch "^Idle|_Total|System$"} | Sort-Object -Property {$_.Group[1].CookedValue} -Descending | Select-Object -First $TotalList | Format-Table @{Name="ProcessId";Expression={$_.Group[0].CookedValue}},@{Name="ProcessorUsage";Expression={[System.Math]::Round($_.Group[1].CookedValue/100/$env:NUMBER_OF_PROCESSORS,4)}},@{Name="ProcessName";Expression={$_.Group[1].InstanceName}},@{Name="WorkingSet";Expression={[System.Math]::Round($_.Group[2].CookedValue/1MB,4)}}
      Sleep -Seconds $Invertal
    }
  }
  End {}
}

该函数依赖于Get-Counter样本,并将输出ProcessId,ProcessName,ProcessorUsageWorkingSet。此计数器示例可以进一步增强UserCommandLine以在输出中包括,但是我还没有找到一种执行该方法的有效方法。


1

马克(Mark)的评论应该得到更多建议,因为它几乎完全是问题所在,并且行之有效:

每次更新都在顶部提供漂亮的标题,而无需清除整个控制台。

$saveY = [console]::CursorTop
$saveX = [console]::CursorLeft      

while ($true) {
    Get-Process | Sort -Descending CPU | Select -First 30;
    Sleep -Seconds 2;
    [console]::setcursorposition($saveX,$saveY+3)
}

(评论链接:https : //superuser.com/a/770455/989044

您应该为此创建一个简单的模块,并将其托管在github上,或为其提供choco。我认为它首先应该是一个标准的模块,因为它在Google上被大量搜索,并且有各种各样的解决方法,但是它们都不是那么优雅并且接近linux top命令。

很抱歉这样发布它,但是由于这里的醒目规则,如果没有50业力左右,就无法发表评论或做笔记。


0

要直接从cmd运行top,您需要使用以下代码创建文件%WINDIR%\ top.bat:

@echo off && cls && @echo TOP Program initialisation. Please Wait...
powershell -ExecutionPolicy unrestricted -command "& {cls; While(1) {ps | sort -des cpu | select -f 35 | ft -a; sleep 2; cls}}"

0

如果您希望按流程进行过滤,请使用findstr

while (1) { ps | findstr explorer | sort -desc cpu | select -first 30; sleep -seconds 2; cls }

0

您可能要使用以下命令从Powershell启动资源监视器:

PS C:\>resmon

您始终可以使用Alt + F4关闭应用程序,这应将焦点切换回Powershell窗口。


1
OP希望使用远程Powershell会话,因此GUI答案不适用于此。
PL

0

您可以为Windows尝试使用htop-alternative- NTop

类似于Windows的htop系统监视器,带有Vi-emulation。因为使用任务管理器还不够酷。

在此处输入图片说明

与Windows NT-op或NukeTop中的NTop相同。无论您喜欢什么(显然后者)。

命令行选项

  • -C使用单色配色方案。
  • -h显示帮助信息。
  • -p PID,PID ...仅显示给定的PID。
  • -s COLUMN按此列排序。
  • -u USERNAME仅显示属于该用户的进程。
  • -v打印版本。

交互式命令:

  • 向上和向下箭头PgUp和PgDown,j和k 滚动进程列表。
  • CTRL +左箭头和右箭头 更改过程排序列。
  • g 转到过程列表的顶部。
  • G 转到过程列表的底部。
  • 用空格 标记选定的进程。
  • U 取消标记所有已标记进程。
  • K 杀死所有标记的进程。
  • 反转排序顺序。
  • F 跟随过程:如果排序顺序导致当前选择的过程在列表中移动,请使选择栏跟随它。手动移动光标会自动禁用此功能。
  • n 搜索下一个。
  • N 搜索中的上一个。

Vi命令

  • :exec CMD 执行给定的Windows命令。
  • :kill PID 杀死所有给定进程。
  • :q,:quit 退出NTop。
  • / PATTERN,:search PATTERN 进行搜索。
  • :sort COLUMN 在给定列之后对过程列表进行排序。
  • :tree 查看进程树。

预编译的二进制文件可以在这里下载


1
您能详细说明如何完成此解决方案吗? 来自的点评 关于这里
fixer1234

0

将以下内容保存mytop.ps1PATH环境变量中的文件夹中的文件中。然后在任何PowerShell控制台中使用以下之一:

  1. mytop -在“内存”列中使用默认排序,并显示前30行。
  2. mytop CPU 50 -按“ CPU”列排序并显示前50行。
  3. While(1) {$p = myTop Memory 50; cls; $p} -使它每秒刷新一次。

mytop.ps1 内容:

##################################################
#  Linux top equivalent in PowerShell
##################################################
if ($args[0] -eq $null) {
    $SortCol = "Memory"
} else {
    $SortCol = $args[0]    
}

if ($args[1] -eq $null) {
    $Top = 30
} else {
    $Top = $args[1]   
}


$LogicalProcessors = (Get-WmiObject -class Win32_processor `
    -Property NumberOfLogicalProcessors).NumberOfLogicalProcessors;

function myTopFunc ([string]$SortCol = "Memory", [int]$Top = 30) {
    ## Check user level of PowerShell 
    if (
        ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent() 
        ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
    )
    {
        $procTbl = get-process -IncludeUserName | select ID, Name, UserName, Description, MainWindowTitle
    } else {
        $procTbl = get-process | select ID, Name, Description, MainWindowTitle
    }

    Get-Counter `
        '\Process(*)\ID Process',`
        '\Process(*)\% Processor Time',`
        '\Process(*)\Working Set - Private'`
        -ea SilentlyContinue |
    foreach CounterSamples |
    where InstanceName -notin "_total","memory compression" |
    group { $_.Path.Split("\\")[3] } |
    foreach {
        $procIndex = [array]::indexof($procTbl.ID, [Int32]$_.Group[0].CookedValue)
        [pscustomobject]@{
            Name = $_.Group[0].InstanceName;
            ID = $_.Group[0].CookedValue;
            User = $procTbl.UserName[$procIndex]
            CPU = if($_.Group[0].InstanceName -eq "idle") {
                $_.Group[1].CookedValue / $LogicalProcessors 
                } else {
                $_.Group[1].CookedValue 
                };
            Memory = $_.Group[2].CookedValue / 1KB;
            Description = $procTbl.Description[$procIndex];
            Title = $procTbl.MainWindowTitle[$procIndex];
        }
    } |
    sort -des $SortCol |
    select -f $Top @(
        "Name", "ID", "User",
        @{ n = "CPU"; e = { ("{0:N1}%" -f $_.CPU) } },
        @{ n = "Memory"; e = { ("{0:N0} K" -f $_.Memory) } },
        "Description", "Title"
        ) | ft -a
}

myTopFunc -SortCol $SortCol -top $Top

输出示例:

Name                               ID User                         CPU   Memory       Description
----                               -- ----                         ---   ------       -----------
sqlservr                         7776 NT SERVICE\MSSQLSERVER       0.0%  19,001,488 K SQL Server Windows NT - 64 Bit
python                          12872 NA\user1                     0.0%  2,159,796 K  Python
svchost                          3328 NT AUTHORITY\SYSTEM          1.6%  1,022,080 K  Host Process for Windows Services
onedrive                        11872 NA\user1                     0.0%  423,396 K    Microsoft OneDrive
python                          13764 NA\user1                     0.0%  304,608 K    Python
chrome                          21188 NA\user1                     0.0%  250,624 K    Google Chrome
python                          28144 NA\user2                     0.0%  225,824 K    Python
code                            21384 NA\user1                     0.0%  211,160 K    Visual Studio Code
code                            27412 NA\user2                     0.0%  185,892 K    Visual Studio Code
ssms                            18288 NA\user1                     29.5% 155,452 K    SSMS
chrome                           7536 NA\user1                     0.0%  154,124 K    Google Chrome
code                            21652 NA\user1                     0.0%  149,900 K    Visual Studio Code
explorer                         3204 NA\user1                     0.0%  134,340 K    Windows Explorer
python                          11712 NA\user1                     0.0%  130,624 K    Python
chrome                          21588 NA\user1                     0.0%  107,448 K    Google Chrome
code                            10152 NA\user1                     0.0%  100,880 K    Visual Studio Code
code                            20232 NA\user2                     0.0%  99,124 K     Visual Studio Code
python                          22184 NA\user1                     0.0%  94,800 K     Python
code                            14828 NA\user1                     0.0%  84,872 K     Visual Studio Code
searchui                        13344 NA\user1                     0.0%  78,260 K     Search and Cortana application
com.docker.service              10644 NT AUTHORITY\SYSTEM          0.0%  77,332 K     Docker.Service

额外信用:

  1. rokumaru for https://stackoverflow.com/a/55698377/5060792
  2. LotPingshttps://stackoverflow.com/a/55680398/5060792
  3. 适用https://stackoverflow.com/a/55697007/5060792的DBADon


0

使用以下命令,它将为您提供前10个CPU利用率,并且每5秒刷新一次输出

while(1){ps | 排序对象-属性cpu-降序| select -First 10; Write-Host“输出将在5秒的nn句柄NPM(K)PM(K)WS(K)CPU ID SI ProcessName中刷新”;睡眠-第二个5}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.