Команда "Топ" для Linux Powershell?


61

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

Я бачив сценарії, які перераховують використання процесора у циклі, але щось на кшталт top було б набагато зручнішим, оскільки ми маємо доступ до SSH / Powershell для управління (я все одно віддаю перевагу оболонці шпаклівки!)


Це прямо підпадає під категорію питань superuser.com .

Класно - знаю, що сайт навіть існував! (Я в першу чергу розробник C #)

3
Властивість CPU для Process Object не є відсотком процесора, це загальний час CPU з початку процесу.

Відповіді:


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

Це простий вкладиш, який також буде тримати етикетки вгорі.

Це працює, тому що форматування таблиці без будь-яких параметрів просто тягне таблицю за замовчуванням. Автоматичний розмір використовується для автоматичного регулювання ширини стовпців, щоб усі дані могли розміщуватися на екрані.

Ось розбивка використаних скорочених команд

  • select -f - це ярлик для -перше
  • ft - це ярлик для Format-Table
  • -a - це ярлик для -autosize
  • Сон за замовчуванням до використання секунд

2
CPUв ps- кількість секунд загального використання, не% CPU. Тож це не так корисно.
Артем

26

Я нічого не знаю про це в одній формі командлета, але, як ви кажете, сценарії легко написати, щоб імітувати зверху.

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

достатньо близько - я можу налаштувати це звідси ... ну, зробили! (Я розробник C #, але керую і нашими серверами - тому

якщо ви хочете дізнатися більше - на прикладі - перегляньте www.poshcode.org
x0n

@TimAtVenturality - Ви можете обернути скрипт як функцію з параметрами, щоб більш реплікувати верх.
Joe Internet

17

Подібне рішення, як і інші, але за допомогою 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або еквівалент диспетчера завдань дасть короткий знімок використання процесора, записаного нещодавно за певний визначений час, і Get-Counter забезпечує це. Оскільки ця публікація Superuser як і раніше є найкращим результатом Google для "повноважень вершини", я вважав, що цю альтернативу варто додати.

Моя команда заснована на прикладі 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 відобразити у форматованій таблиці

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, який забезпечує функціональність. Існує безкоштовна зовнішня команда, яка робить те, що ви хочете. Подивіться на pslist від Марка Русиновича з набору Сисинтерналів . Pslist надає перелік виконуючих процесів у налаштуваннях. "pslist -s" надає потрібне вам безперервне оновлення зі швидкістю оновлення за замовчуванням один раз на секунду.

Я вважаю за краще використовувати провідник графічного інтерфейсу Марка, але 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

Також я хочу зазначити, що якщо ви хочете, щоб середовище Windows було подібне до Linux, ви можете використовувати Cygwin. Він приносить середовище Linux Enviroment для 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 або забезпечити його шоколадом. Я думаю, що це повинен бути стандартний модуль, в першу чергу, тому що він дуже сильно шукається в Google і існує всілякі обхідні шляхи, але жоден з них не є настільки елегантним і близьким до верхньої команди Linux.

Вибачте за те, що розмістили його так, але через стриктні правила тут неможливо коментувати чи робити замітку без 50 карми чи близько того.


0

Для запуску вершини безпосередньо з 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

Якщо ви хочете фільтрувати за процесом, використовуйте findstr

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

0

Можливо, ви захочете запустити монітор ресурсів із Powerhell за допомогою:

PS C:\>resmon

Ви завжди можете закрити програму за допомогою Alt + F4, і це повинно переключити фокус назад у вікно Powerhell.


1
ОП хотів би використовувати віддалені сеанси передачі даних, тому відповідь на графічний інтерфейс тут не вміщується.
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 Дотримуйтесь процесу: якщо порядок сортування призводить до переміщення поточного обраного процесу у списку, змусіть його слідувати рядок вибору. Переміщення курсору вручну автоматично відключає цю функцію.
  • n Далі в пошуку.
  • N Попередній у пошуку.

Команди Vi :

  • : exec CMD Виконує задану команду Windows.
  • : kill PID (s) Вбийте всі задані процеси.
  • : q ,: кинути Вийти з NTop.
  • / PATTERN,: пошук PATTERN Робіть пошук.
  • : сортування 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 секунд

поки (1) {ps | Сортувати-Об'єкт -властивість CPU -Зниження | select -First 10; Write-Host "вихід буде оновлений через 5 секунд nn ручок NPM (K) PM (K) WS (K) CPU (s) Id SI ProcessName"; сон -секунди 5}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.