54

Я ищу командлет PowerShell, который может обеспечить функциональность, аналогичную приложению Linux Top. То, что обновляется с заданным интервалом и отображает список процессов с использованием CPU% util.

Я видел сценарии, которые отображают загрузку CPU% в цикле, но что-то вроде top было бы намного удобнее, так как мы настроили доступ SSH/Powershell для управления (я все еще предпочитаю оболочку-замазку!)

11 ответов11

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

Это простой вкладыш, который также будет держать надписи сверху.

Это работает, потому что форматирование таблицы без каких-либо параметров просто рисует таблицу по умолчанию. autosize используется для автоматической настройки ширины столбца, чтобы все данные помещались на экране.

Вот разбивка сокращенных команд, используемых

  • select -f является ярлыком для -first
  • ft является ярлыком для Format-Table
  • -a это сокращение от -autosize
  • сон по умолчанию использует секунды
24

Я ничего не знаю об этом в форме единого командлета, но, как вы говорите, легко написать сценарий для эмуляции top.

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

Подобное решение, как и другие, но с использованием 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, отображают общее время ЦП с начала процесса. Это было бесполезно на моем сервере, который работает круглосуточно и без выходных, где лучшим результатом всегда были svchost и system за миллионы секунд. Истинный top или эквивалент диспетчера задач позволил бы получить снимок использования ЦП, записанный за последнее время в течение некоторого фиксированного времени, и Get-Counter обеспечивает это. Поскольку этот пост суперпользователя по-прежнему является лучшим результатом Google для "powershell top", я решил, что эта альтернатива заслуживает внимания.

Моя команда основана на примере 13 из документов Get-Counter: 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 отображение в отформатированной таблице
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, который обеспечивает функциональность. Есть бесплатная внешняя команда, которая делает то, что вы хотите. Посмотрите на псевдоним Марка Руссиновича из сюиты Sysinternals. Pslist предоставляет список выполняющихся процессов в настраиваемом представлении. «pslist -s» обеспечивает необходимый вид непрерывного обновления с частотой обновления по умолчанию один раз в секунду.

Я предпочитаю использовать GUI Process Explorer от Mark, но pslist удобен для консольных сессий.

Домашняя страница Sysinternals находится здесь: http://technet.microsoft.com/en-us/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

Это также может помочь:

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,ProcessorUsage и WorkingSet . Этот образец счетчика может быть дополнительно расширен, чтобы включить User , CommandLine в вывод, но я еще не разработал эффективный способ сделать это.

1

Кроме того, я хочу отметить, что если вы хотите использовать Linux-подобную среду для Windows, вы можете использовать Cygwin. Он переносит среду Linux в Windows. Вы можете использовать почти каждую команду. Не уверен, насколько это полезно для вас.

http://www.cygwin.com/

0

Вы можете запустить монитор ресурсов из powershell с помощью:

PS C:\>resmon

Вы всегда можете закрыть приложение с помощью Alt+F4, и это должно переключить фокус обратно на окно powershell.

0

Если вы хотите фильтровать по процессу, используйте findstr

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

Чтобы запустить top напрямую из cmd, вам нужно создать файл% 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}}"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .