Команды Linux "топ" для Windows?

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

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

26
задан user1820024
20.05.2023 16:02 Количество просмотров материала 3554
Распечатать страницу

11 ответов

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

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

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

здесь приводятся сокращенные команды

  • select-f является ярлыком для-first
  • FT-это ярлык формат-таблица
  • -это ярлык для-autosize
  • стандартные сна через секунд
27
отвечен user1820024 2023-05-21 23:50

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

while (1) { ps | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
24
отвечен x0n 2023-05-22 02:07

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

мои команды на примере 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 это поле мы intetested В, вроде поставить самый большой на вершине
  • select -f 15 экран первые 15
  • ft -a отображать в форматированной таблице
8
отвечен fireforge124 2023-05-22 04:24

обеспечивает хорошие заголовки в верхней части с каждым обновлением без необходимости очистки всей консоли.

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

while ($true) {
    Get-Process | Sort -Descending CPU | Select -First 30;
    Sleep -Seconds 2;
    [console]::setcursorposition($saveX,$saveY+3)
}
6
отвечен Mark 2023-05-22 06:41

мне неизвестен командлет PowerShell, предоставляющий эти функции. Существует бесплатная внешняя команда, которая делает то, что вы хотите. Посмотрите на Марка Руссиновича pslist из набора Sysinternals. Pslist предоставляет список выполняемых процессов в настраиваемом представлении. "pslist-s" предоставляет вид непрерывного обновления, которое вы хотите, с частотой обновления по умолчанию один раз в секунду.

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

программы Домашняя страница здесь: http://technet.microsoft.com/en-us/sysinternals

Dennis

5
отвечен DMcCunney 2023-05-22 08:58
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 "-------  ------    -----      ----- -----   ------     -- -----------"}

Это просто немного лучше, как вы можете видеть заголовки наверху каждый раз

2
отвечен Ross Wiley 2023-05-22 11:15

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

http://www.cygwin.com/

1
отвечен Josiah 2023-05-22 13:32

это также может сделать трюк:

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
отвечен Hames 2023-05-22 15:49

для запуска 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}}"
0
отвечен user374797 2023-05-22 18:06

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

while (1) { ps | findstr explorer | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
0
отвечен AlexanderN 2023-05-22 20:23

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

PS C:\>resmon

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

0
отвечен Albino Cordeiro 2023-05-22 22:40

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх