Linux «Верхняя» команда для Windows Powershell?

61

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

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


источник
Это прямо относится к категории вопросов superuser.com .
Круто-не понял, что сайт вообще существует! (Я в основном разработчик на C #)
3
Свойство ЦП в Объекте процесса - это не процент ЦП, а общее время ЦП с момента запуска процесса.

Ответы:

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

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

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

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

  • select -f является ярлыком для -first
  • ft - это ярлык для Format-Table
  • -a это сокращение от -autosize
  • сон по умолчанию использует секунды
user1820024
источник
2
CPUin ps- количество секунд общего использования, но не% CPU. Так что это не так полезно.
Артём
26

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

while (1) { ps | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
x0n
источник
достаточно близко - я могу настроить его отсюда ... хорошо, готово! (Я разработчик на C #, но тоже управляю нашими серверами - так что
если вы хотите узнать больше - на примере - посетите www.poshcode.org
x0n
@TimAtVenturality - Вы можете обернуть скрипт как функцию с параметрами, чтобы более точно копировать top.
Джо Интернет
18

Подобное решение, как и другие, но с использованием 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'выбирает ЦП% данных. Эта команда, похоже, занимает значительное время для возврата, поэтому нет необходимостиsleep
  • cls ясно для новой таблицы
  • sort -des CookedValue CookedValue - это поле, в котором мы участвуем
  • select -f 15 показать первые 15
  • ft -a отображать в отформатированной таблице
fireforge124
источник
4
Это лучший ответ: Get-Counterдает вам «мгновенный» процессор, а не совокупное время процессора с 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, который обеспечивает функциональность. Есть бесплатная внешняя команда, которая делает то, что вы хотите. Посмотрите на псевдоним Марка Руссиновича из сюиты Sysinternals. Pslist предоставляет список выполняющихся процессов в настраиваемом представлении. «pslist -s» обеспечивает необходимый тип непрерывного обновления с частотой обновления по умолчанию один раз в секунду.

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

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

Деннис

DMcCunney
источник
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

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

Хеймс
источник
1

Этот комментарий от Марка должен получить больше рекомендаций, потому что он делает почти точно, что вопрос был, и он работает:

Обеспечивает хорошие заголовки в верхней части каждого обновления без необходимости очищать всю консоль.

$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 и есть все виды обходных путей, но ни один из них не является настолько элегантным и близким к команде top linux.

Извините за публикацию, но из-за правил стрикта здесь невозможно комментировать или делать заметки без 50 кармы или около того.

Матти _
источник
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}}"
user374797
источник
0

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

while (1) { ps | findstr explorer | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
AlexanderN
источник
0

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

PS C:\>resmon

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

Альбино Кордейро
источник
1
OP хотел бы использовать удаленные сеансы PowerShell, поэтому ответ с графическим интерфейсом здесь не подходит.
PL
0

Вы можете попробовать htop-альтернативу для Windows - NTop

htop-подобный системный монитор с эмуляцией Vi для Windows. Потому что использование диспетчера задач недостаточно круто.

введите описание изображения здесь

NTop как в Windows NT-op или NukeTop. Что бы вы ни предпочли (последнее очевидно).

Параметры командной строки :

  • -C Использовать монохромную цветовую схему.
  • -h Показать справочную информацию.
  • -p PID, PID ... Показать только данные PID.
  • -S COLUMN Сортировать по этому столбцу.
  • -u USERNAME Отображать только процессы, принадлежащие этому пользователю.
  • -v Версия для печати.

Интерактивные команды:

  • Стрелки вверх и вниз, PgUp и PgDown, j и k Прокрутка списка процессов.
  • CTRL + Стрелки влево и вправо Изменить столбец сортировки процесса.
  • g Перейти к началу списка процессов.
  • G Перейти к нижней части списка процессов.
  • Пробел Отметить выбранный процесс.
  • U Отключить все отмеченные процессы.
  • K Убить все помеченные процессы.
  • Я инвертирую порядок сортировки.
  • F Follow process: если порядок сортировки вызывает перемещение выбранного процесса в списке, сделайте так, чтобы панель выбора следовала ему. Перемещение курсора вручную автоматически отключает эту функцию.
  • n Следующее в поиске.
  • N Предыдущая в поиске.

Vi команды :

  • : exec CMD Выполняет данную команду Windows.
  • : kill PID (s) Убить все указанные процессы.
  • : q ,: выйти Выйти из NTop.
  • / PATTERN,: поиск PATTERN Выполнить поиск.
  • : sort COLUMN Сортировать список процессов после указанного столбца.
  • : дерево Просмотр дерева процессов.

Скомпилированные бинарные файлы можно скачать здесь

джеограф
источник
1
Можете ли вы рассказать, как решить эту проблему? Из обзора Хорошее руководство по рекомендации программного обеспечения здесь
fixer1234
0

Сохраните следующее в файле, который называется mytop.ps1в папке, которая находится в вашей PATHпеременной среды. Затем используйте одну из следующих команд на любой консоли 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 для https://stackoverflow.com/a/55698377/5060792
  2. LotPings для https://stackoverflow.com/a/55680398/5060792
  3. DBADon для https://stackoverflow.com/a/55697007/5060792
глина
источник
0

Используйте команду ниже, это даст вам топ 10 загрузки процессора, и выход будет обновляться каждые 5 секунд

while (1) {пс | Sort-Object -Property CPU -Восходящий | выберите -Первый 10; Запись-Хост "выход будет обновляться через 5 секунд nn Ручки NPM (K) PM (K) WS (K) CPU (s) Id SI ProcessName"; сон-секунд 5}

user1057886
источник