适用于 Windows Powershell 的 Linux“顶部”命令?

79 linux ssh display powershell top

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

我见过在循环中列出 CPU % 利用率的脚本,但是像 top 这样的东西会更方便,因为我们已经设置了 SSH/Powershell 访问权限以进行管理(我仍然更喜欢腻子外壳!)

小智 44

这是一个简单的单衬,也将标签保持在顶部:

While(1) {ps | sort -des cpu | select -f 15 | ft -a; sleep 1; cls}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为在没有任何参数的情况下格式化表格只会绘制默认表格。autosize用于自动调整列宽,以便所有数据都可以显示在屏幕上。


缩短命令的细分:

  • select -f: 快捷方式 -first
  • ft: 快捷方式 Format-Table
  • -a: 快捷方式 -autosize
  • sleep: 默认使用秒

  • `ps` 中的 `CPU` 是总使用的秒数,而不是 % CPU。所以这不是很有用。 (6认同)

小智 29

我对单个 cmdlet 形式一无所知,但就像你说的,脚本很容易编写来模拟 top。

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


小智 28

与其他解决方案类似的解决方案,但使用Get-Counter代替Get-Process

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

示例输出:

Path                                                      InstanceName              CookedValue
----                                                      ------------              -----------
\\server_name\process(_total)\% processor time                 _total               4806.03969127454
\\server_name\process(idle)\% processor time                   idle                 1103.7573538257
\\server_name\process(program2)\% processor time               program              749.692930701698
\\server_name\process(program5)\% processor time               program              563.424255927765
\\server_name\process(program1)\% processor time               program              535.714866291973
\\server_name\process(program6)\% processor time               program              455.665518455242
\\server_name\process(program3)\% processor time               program              426.416718284128
\\server_name\process(program)\% processor time                program              395.628507577693
\\server_name\process(program4)\% processor time               program              335.591496700144
\\server_name\process(microsoftedgecp2)\% processor time       microsoftedgecp      129.310484967028
\\server_name\process(system)\% processor time                 system               80.0493478367316
\\server_name\process(chrome8)\% processor time                chrome               1.53941053532176
Run Code Online (Sandbox Code Playgroud)

我发现这里大部分使用其他解决方案的Get-Process报告,总的CPU时间,因为过程的开始,这是不是我的服务器上有用的停留7×24小时其中顶部的结果总是svchostsystem在百万秒。

  • 一个真正的top或任务管理器等效将给出最近在某个固定时间内记录的 CPU 使用情况的快照,并提供该快照Get-Counter。我认为这个替代方案值得做出贡献,因为这个问题仍然是powershell top.

基于Get-Counter 文档中的示例 13 ,该命令的细分:

  • While(1) {: 创建一个循环
  • get-counter '\Process(*)\% Processor Time': 选择 CPU % 数据,这需要大量时间才能返回,因此无需 sleep

  • cls: 清除新表

  • sort -des CookedValue:对CookedValue[我们感兴趣的领域]排序最大
  • select -f 15: 显示前 15
  • ft -a: 在格式化表格中显示

  • 这是最佳答案:`Get-Counter` 为您提供“瞬时”CPU,而不是`ps` 的累积 CPU 时间。[更好的格式](https://www.penguinprompt.com/list-process-cpu-usage-windows-and-linux/): `Get-Counter '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples| 选择对象 - 属性实例名,熟值| ? {$_.instanceName -notmatch "^(idle|_total|system)$"} | 排序对象 - 属性熟值 - 降序| 选择对象 - 前 25| ft InstanceName,@{L='CPU';E={($_.Cookedvalue/100/$env:NUMBER_OF_PROCESSORS).toString('P')}} -AutoSize` (5认同)

小智 10

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

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

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


Geo*_*aph 7

您可以尝试NTop二进制文件),这htop是 Windows的替代方案,使用Vi-emulation for Windows:

截屏

  • 命令行选项
    • C使用单色配色方案
    • h:显示帮助
    • p <PID>:只显示给定的 PID
    • s <COLUMN>:按此列排序
    • u <USERNAME>:只显示属于这个用户的进程
    • v:印刷版

  • 交互命令:
    • ?, ?, PageUp, PageDn, j, k:滚动进程列表
    • CTRL+??:更改进程排序列
    • g:转到进程列表的顶部
    • G:转到进程列表的底部
    • Space:标记一个选定的进程
    • U取消标记所有标记的进程
    • K:杀死所有标记的进程
    • I:反转排序顺序
    • F:跟随进程
      如果排序顺序导致当前选定的进程在列表中移动,则使选择栏跟随它(手动移动光标会自动禁用此功能)
    • n:下一个搜索
    • N:上一个搜索

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

  • 您能详细说明如何以此完成解决方案吗? [来自评论](https://superuser.com/review/low-quality-posts/849839) 关于推荐软件的良好指导[此处](https://meta.superuser.com/questions/5329/how-do-我在我的答案中推荐软件) (2认同)

小智 5

我不知道提供该功能的 PowerShell cmdlet,但这里有一个免费软件外部命令,可以满足您的需求,pslist来自Sysinternals套件的Mark Russinovich :

  • pslist 在可配置视图中提供正在执行的进程列表
  • pslist -s 提供您想要的那种连续更新,默认刷新率为每秒一次

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