Perintah "Top" Linux untuk Windows Powershell?

61

Saya mencari cmdlet PowerShell yang dapat memberikan fungsionalitas yang mirip dengan aplikasi Linux Top. Sesuatu yang menyegarkan pada suatu interval tertentu dan menampilkan daftar proses dengan util CPU%.

Saya telah melihat skrip yang mencantumkan utilisasi CPU% dalam satu lingkaran tetapi sesuatu seperti top akan jauh lebih berguna karena kami telah menyiapkan akses SSH / Powershell untuk manajemen (saya masih lebih suka dempul shell!)


sumber
Ini jatuh tepat di kategori pertanyaan superuser.com .
Keren -tidak menyadari bahwa situs itu bahkan ada! (Saya terutama seorang pengembang C #)
3
Properti CPU pada Object Process bukan persentase CPU, melainkan total waktu CPU sejak proses dimulai.

Jawaban:

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

Ini adalah liner sederhana yang juga akan menjaga label di atas.

Ini berfungsi karena memformat tabel tanpa parameter apa pun hanya menggambar tabel default. autosize digunakan untuk secara otomatis menyesuaikan lebar kolom sehingga semua data dapat masuk ke layar.

Berikut ini adalah rincian dari perintah singkat yang digunakan

  • pilih -f adalah jalan pintas untuk -first
  • ft adalah jalan pintas untuk Format-Table
  • -a adalah jalan pintas untuk -autosize
  • sleep default untuk menggunakan detik
pengguna1820024
sumber
2
CPUin psadalah jumlah detik total penggunaan, bukan% CPU. Jadi ini tidak begitu berguna.
Artyom
26

Tidak ada yang saya ketahui tentang itu dalam bentuk cmdlet tunggal, tetapi seperti yang Anda katakan, skrip mudah ditulis untuk ditiru.

while (1) { ps | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
x0n
sumber
cukup dekat - saya bisa mengubahnya dari sini ... well, selesai! (Saya adalah pengembang C #, tetapi juga mengelola server kami - jadi
jika Anda ingin mempelajari lebih lanjut - dengan contoh - lihat www.poshcode.org
x0n
@TimAtVenturality - Anda dapat membungkus skrip sebagai fungsi dengan parameter untuk mereplikasi atas.
Joe Internet
17

Solusi serupa dengan yang lain, tetapi menggunakan Get-Counter dan bukan Get-Process.

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

Output sampel:

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

Saya menemukan sebagian besar solusi lain di sini menggunakan get-proses melaporkan total waktu CPU sejak awal proses. Itu tidak berguna di server saya yang bertahan 24/7 di mana hasil teratas selalu adil svchostdan systemdalam jutaan detik. topSetara dengan benar atau Task Manager akan memberikan snapshot dari penggunaan CPU yang direkam baru-baru ini selama beberapa waktu tetap dan Get-Counter menyediakannya. Karena posting Superuser ini masih merupakan hasil Google teratas untuk "powershell top", saya pikir alternatif ini layak untuk dikontribusikan.

Perintah saya didasarkan pada contoh 13 dari dokumen Get-Counter: https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Diagnostics/Get-Counter .
Berikut ini rincian dari satu-baris sehingga Anda dapat lebih mudah memodifikasinya sesuai kebutuhan Anda:

  • While(1) { hanya loop itu
  • get-counter '\Process(*)\% Processor Time'memilih data CPU%. Perintah ini tampaknya membutuhkan banyak waktu untuk kembali, jadi tidak perlusleep
  • cls jelas untuk tabel baru
  • sort -des CookedValue CookedValue adalah bidang yang kami minati, semacam untuk menempatkan yang terbesar di atas
  • select -f 15 tampilkan dulu 15
  • ft -a tampilan dalam tabel yang diformat
fireforge124
sumber
4
Ini adalah jawaban terbaik: Get-Countermemberi Anda CPU "instan", daripada waktu kumulatif CPU dari ps. Format yang lebih baik : 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

Memberikan judul yang bagus di bagian atas dengan setiap pembaruan tanpa harus menghapus seluruh konsol.

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

while ($true) {
    Get-Process | Sort -Descending CPU | Select -First 30;
    Sleep -Seconds 2;
    [console]::setcursorposition($saveX,$saveY+3)
}
Menandai
sumber
5

Saya tidak mengetahui cmdlet PowerShell yang menyediakan fungsionalitas. Ada perintah eksternal freeware yang berfungsi sesuai keinginan Anda. Lihatlah Mark Russinovich ini pslist dari Sysinternals suite. Pslist menyediakan daftar proses eksekusi dalam tampilan yang dapat dikonfigurasi. "pslist -s" menyediakan jenis pembaruan berkelanjutan yang Anda inginkan, dengan kecepatan pembaruan default satu kali per detik.

Saya lebih suka menggunakan Mark's GUI Process Explorer, tetapi pslist berguna untuk sesi konsol.

Halaman utama Sysinternals ada di sini: http://technet.microsoft.com/en-us/sysinternals

Dennis

DMcCunney
sumber
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 "-------  ------    -----      ----- -----   ------     -- -----------"}

Ini hanya cara yang sedikit lebih baik, karena Anda bisa melihat judul di bagian atas setiap kali

Ross Wiley
sumber
1

Juga, saya ingin menunjukkan bahwa jika Anda ingin lingkungan seperti linux untuk Windows Anda dapat menggunakan Cygwin. Ini membawa Lingkungan Linux ke Windows. Anda dapat menggunakan hampir setiap perintah. Tidak yakin seberapa bermanfaat ini bagi Anda.

http://www.cygwin.com/

Josiah
sumber
1

Ini juga dapat melakukan trik:

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 {}
}

Fungsi ini bergantung pada Get-Countersampel dan akan menampilkan ProcessId,ProcessName,ProcessorUsagedan WorkingSet. Sampel pencacah ini selanjutnya dapat ditingkatkan untuk menyertakan User, CommandLinedalam output tetapi saya belum menemukan cara yang tepat untuk melakukannya.

Hames
sumber
1

Komentar dari Markus ini harus mendapatkan lebih banyak rekomendasi, karena hampir persis seperti apa pertanyaannya dan berhasil:

Memberikan judul yang bagus di bagian atas dengan setiap pembaruan tanpa harus menghapus seluruh konsol.

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

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

(tautan ke komentar: https://superuser.com/a/770455/989044 )

Anda harus membuat modul sederhana untuk itu dan meng-host di github atau menyediakannya dengan choco. Saya pikir itu harus menjadi modul standar di tempat pertama, karena itu banyak dicari di google dan ada semua jenis solusi tetapi tidak satupun dari mereka yang begitu elegan dan dekat dengan perintah top linux.

Maaf karena memposting seperti ini, tetapi karena aturan ketat di sini, mustahil untuk berkomentar atau membuat catatan tanpa 50 karma atau lebih.

Matthi _
sumber
0

Untuk menjalankan teratas langsung dari cmd, Anda harus membuat file% WINDIR% \ top.bat dengan kode ini:

@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}}"
pengguna374797
sumber
0

Jika Anda ingin memfilter berdasarkan proses, gunakan findstr

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

Anda mungkin ingin meluncurkan monitor sumber daya dari PowerShell dengan:

PS C:\>resmon

Anda selalu dapat menutup aplikasi dengan Alt + F4 dan yang seharusnya mengalihkan fokus kembali ke jendela PowerShell.

Albino Cordeiro
sumber
1
OP ingin menggunakan sesi PowerShell jarak jauh, jadi jawaban GUI tidak cocok di sini.
PL
0

Anda dapat mencoba htop-alternative untuk windows - NTop

monitor sistem seperti htop dengan Vi-emulation untuk Windows. Karena menggunakan Task Manager tidak cukup keren.

masukkan deskripsi gambar di sini

NTop seperti pada Windows NT-op atau NukeTop. Apa pun yang Anda sukai (yang terakhir jelas).

Opsi baris perintah :

  • -C Gunakan skema warna monokrom.
  • -h Menampilkan informasi bantuan.
  • -p PID, PID ... Tampilkan hanya PID yang diberikan.
  • -s COLUMN Urutkan berdasarkan kolom ini.
  • -u USERNAME Hanya menampilkan proses yang dimiliki oleh pengguna ini.
  • -v Cetak versi.

Perintah interaktif:

  • Panah Atas dan Bawah, PgUp dan PgDown, j dan k Gulir daftar proses.
  • CTRL + Panah Kiri dan Kanan Ubah kolom sortir proses.
  • g Pergi ke atas daftar proses.
  • G Pergi ke bagian bawah daftar proses.
  • Space Tag proses yang dipilih.
  • U Untag semua proses yang ditandai.
  • K Bunuh semua proses yang ditandai.
  • Saya membalikkan urutan pengurutan.
  • F Ikuti proses: jika urutan menyortir menyebabkan proses yang dipilih saat ini untuk pindah dalam daftar, buat bilah seleksi mengikutinya. Memindahkan kursor secara manual menonaktifkan fitur ini secara otomatis.
  • n Selanjutnya dalam pencarian.
  • N Sebelumnya dalam pencarian.

Perintah vi :

  • : exec CMD Menjalankan perintah Windows yang diberikan.
  • : kill PID (s) Bunuh semua proses yang diberikan.
  • : q ,: keluar dari NTop.
  • / POLA,: POLA pencarian Lakukan pencarian.
  • : sort COLUMN Urutkan daftar proses setelah kolom yang diberikan.
  • : pohon Lihat pohon proses.

Binari yang dikompilasi dapat diunduh di sini

Geografi
sumber
1
Bisakah Anda menguraikan cara menyelesaikan solusi dengan ini? dari ulasan Panduan yang bagus untuk merekomendasikan perangkat lunak di sini
fixer1234
0

Simpan yang berikut dalam file yang disebut mytop.ps1dalam folder yang ada di PATHvariabel lingkungan Anda . Kemudian gunakan salah satu dari yang berikut ini dari konsol PowerShell:

  1. mytop - untuk menggunakan pengurutan standar berdasarkan kolom 'Memori' dan tampilkan 30 baris pertama.
  2. mytop CPU 50 - untuk mengurutkan berdasarkan kolom 'CPU' dan menunjukkan 50 baris pertama.
  3. While(1) {$p = myTop Memory 50; cls; $p} - untuk menyegarkan setiap detik.

mytop.ps1 isi:

##################################################
#  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

Contoh output:

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

Kredit tambahan untuk:

  1. rokumaru untuk https://stackoverflow.com/a/55698377/5060792
  2. LotPings untuk https://stackoverflow.com/a/55680398/5060792
  3. DBADon untuk https://stackoverflow.com/a/55697007/5060792
Tanah liat
sumber
0

Gunakan perintah di bawah ini yang akan memberi Anda 10 utilisasi CPU dan output akan disegarkan setiap 5 detik

while (1) {ps | Sortir-Objek -Properti cpu -Turunkan | pilih -Pertama 10; Tulis-Host "output akan di-refresh dalam 5 detik nn Menangani NPM (K) PM (K) WS (K) CPU (s) Id SI ProcessName"; tidur -Kedua 5}

pengguna1057886
sumber