Windows Powershell için Linux “En İyi” komutu?


61

Linux Top uygulamasına benzer işlevler sağlayabilen bir PowerShell cmdlet'i arıyorum. Belirli bir aralıkta yenilenen ve işlem listesini% CPU ile kullanan görüntüler.

Bir döngüde CPU% kullanımını listeleyen komut dosyaları gördüm, ancak üst sıradaki bir şey yönetim için SSH / Powershell erişim ayarına sahip olduğumuzdan çok daha kullanışlı olurdu (hala bir macun kabuğunu tercih ediyorum!)


Bu, superuser.com soru kategorisinde kareye düşer .

Cool-didnt o sitenin bile var olduğunun farkında! (Ben öncelikle C # geliştiricisiyim)

3
İşlem Nesnesindeki CPU özelliği CPU yüzdesi değil, işlem başlangıcından beri toplam CPU zamanı.

Yanıtlar:


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

Bu, etiketleri üstte tutacak basit bir astardır.

Bu, tablonun herhangi bir parametresiz formatlanması sadece varsayılan tabloyu çizmesi nedeniyle işe yarar. otomatik boyut sütun genişliğini otomatik olarak ayarlamak için kullanılır, böylece tüm veriler ekrana sığabilir.

İşte kullanılan kısaltılmış komutların bir dökümü.

  • select -f -first için bir kısayol
  • ft Format Tablosu için bir kısayol
  • -a otomatik boyut için bir kısayol
  • varsayılanları saniye kullanarak uyku

2
CPUin ps% CPU değil, toplam kullanımın saniye sayısıdır. Yani bu çok kullanışlı değil.
Artyom

26

Bunu tek bir cmdlet formunda bildiğim hiçbir şey yok, ancak dediğiniz gibi senaryoların üstünü taklit etmek kolaydır.

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

yeterince yakın - buradan çimdikleyebilirim ... iyi, bitti! (Ben bir C # geliştiricisiyim, ancak sunucularımızı da yönetiyoruz - bu yüzden PowerShell eğrisini açın ...)

daha fazla bilgi edinmek istiyorsanız - örnek olarak - www.poshcode.org adresini ziyaret edin
x0n

@TimAtVenturality - Üst kısmı daha yakından çoğaltmak için betiği parametrelerle bir işlev olarak sarabilirsiniz.
Joe Internet

17

Diğerleriyle benzer bir çözüm, ancak Get-Process yerine Get-Counter kullanıyor.

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

Örnek çıktı:

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

Buradaki diğer çözümlerin çoğunu, işlem başlangıcından bu yana toplam CPU süresini al-işlem raporunu kullanarak buldum. Bu, en iyi sonucun her zaman sadece svchostve systemmilyonlarca saniyede olduğu 7 gün 24 saat konaklayan sunucumda kullanışlı değildi . Doğru topveya Görev Yöneticisi eşdeğeri, yakın bir süre önce kaydedilmiş olan CPU kullanımının anlık görüntüsünü verir ve Get-Counter bunu sağlar. Bu Süper kullanıcı gönderisi hala "powershell top" için en iyi Google sonucu olduğundan, bu alternatifin katkıda bulunmaya değer olduğunu düşündüm.

Komutum Get-Counter belgelerinde örnek 13'e dayanıyor: https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Diagnostics/Get-Counter .
İşte bir astarın dökümü, böylece ihtiyaçlarınızı daha kolay bir şekilde değiştirebilirsiniz:

  • While(1) { sadece onu döngüler
  • get-counter '\Process(*)\% Processor Time'CPU% verisini seçer. Bu komutun geri dönmesi önemli bir zaman alıyor gibi görünüyor;sleep
  • cls yeni tablo için temizle
  • sort -des CookedValue CookedValue en iyiyi en üst sıraya koymak için en çok test ettiğimiz alandır.
  • select -f 15 ilk önce 15 göster
  • ft -a biçimlendirilmiş tabloda görüntüleme

4
Bu en iyi cevaptır: Get-Countersize kümülatif CPU zamanından ziyade "anlık" CPU'yu verir ps. Daha iyi biçimlendirme : 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 22:17

6

Tüm konsolu silmeye gerek kalmadan her güncellemeyle en tepedeki hoş başlıkları sunar.

$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

İşlevsellik sağlayan bir PowerShell cmdlet'inin farkında değilim. Ne istediğinizi yapan ücretsiz bir harici komut var. Mark Russinovich'in psist listesine Sysinternals takımından bakın. Pslist, yapılandırılabilir görünümde yürütme işlemlerinin bir listesini sağlar. "pslist -s", saniyede bir kez varsayılan yenileme hızıyla istediğiniz sürekli güncelleme türünü sağlar.

Mark'ın GUI İşlem Gezgini'ni kullanmayı tercih ediyorum, ancak pslist konsol oturumları için kullanışlıdır.

Sysinternals ana sayfası burada: http://technet.microsoft.com/en-us/sysinternals

Dennis


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

Bu sadece biraz daha güzel bir yoldur, çünkü başlıkları her seferinde görebiliyorsunuz


1

Ayrıca, Windows için linux benzeri bir ortam istiyorsanız, Cygwin'i kullanabileceğinizi belirtmek isterim. Linux Ortamını Windows'a getirir. Hemen hemen her komutu kullanabilirsiniz. Bunun senin için ne kadar yararlı olduğundan emin değilim.

http://www.cygwin.com/


1

Bu aynı zamanda hile de yapabilir:

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

Fonksiyonu dayanır Get-Counterörnekleri ve irade çıkışı ProcessId,ProcessName,ProcessorUsageve WorkingSet. Bu sayaç numunesi çıktıya dahil edilecek şekilde daha da geliştirilebilir User, CommandLineancak bunu yapmak için henüz daha başarılı bir yol bulmadım.


1

Mark'ın bu yorumu daha fazla öneri almalı çünkü neredeyse tam olarak sorunun ne olduğunu ve işe yarıyor:

Tüm konsolu silmeye gerek kalmadan her güncellemeyle en tepedeki hoş başlıkları sunar.

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

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

(Yorum yapmak için link: https://superuser.com/a/770455/989044 )

Bunun için basit bir modül yapmalı ve github'da barındırmalı ya da choco sağlamalısınız. Öncelikle standart bir modül olması gerektiğini düşünüyorum, çünkü google'da yoğun bir şekilde aranıyor ve her türlü geçici çözüm var ama hiçbiri o kadar zarif ve linux top komutanlığına yakın değil.

Bu şekilde gönderdiğim için üzgünüm, ancak buradaki kurallar nedeniyle 50 karma kadar yorum yapmamak veya not yazmak imkansız.


0

Üstünü doğrudan cmd'den çalıştırmak için, bu kodla% WINDIR% \ top.bat dosyası oluşturmanız gerekir:

@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

Sürece göre filtrelemek istiyorsanız findstr kullanın.

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

0

Kaynak izleyiciyi powershell'den şunlarla başlatmak isteyebilirsiniz:

PS C:\>resmon

Uygulamayı her zaman Alt + F4 ile kapatabilirsiniz ve odağı powershell penceresine geri döndürmelidir.


1
OP uzak powershell oturumlarını kullanmak istiyor, bu yüzden bir GUI yanıtı buraya uymuyor.
PL

0

Windows için Htop-Alternatif'i deneyebilirsiniz - NTop

Windows için Vi-emülasyonlu Htop benzeri sistem monitörü. Çünkü Görev Yöneticisini kullanmak yeterince iyi değil.

görüntü tanımını buraya girin

NTop, Windows NT-op veya NukeTop'ta olduğu gibi. Hangisini tercih ederseniz edin (ikincisi açıkçası).

Komut satırı seçenekleri :

  • -C Tek renkli renk şeması kullanın.
  • -h Yardım bilgisini göster.
  • -p PID, PID ... Sadece verilen PID'leri göster.
  • -S COLUMN Bu sütuna göre sırala.
  • -u USERNAME Yalnızca bu kullanıcıya ait işlemleri görüntüler.
  • -V sürümü yazdırın.

Etkileşimli komutlar:

  • Yukarı ve Aşağı Oklar, PgUp ve PgDown, j ve k İşlem listesini kaydırın.
  • CTRL + Sol ve Sağ Oklar İşlem sıralama sütununu değiştirin.
  • g İşlem listesinin en üstüne gidin.
  • G İşlem listesinin en altına gidin.
  • Boşluk Seçilen bir işlemi etiketleyin.
  • U Etiketli tüm işlemlerin etiketini kaldırın.
  • K Tüm etiketli işlemleri kapatın.
  • Ben sıralama düzeni ters çevirin.
  • F İşlemi izleyin: sıralama düzeni, seçili işlemin listede hareket etmesine neden oluyorsa, seçim çubuğunu takip etmesini sağlayın. İmleci elle hareket ettirmek bu özelliği otomatik olarak devre dışı bırakır.
  • Aramada n sonraki.
  • N Aramada önceki.

Vi komutları :

  • : exec CMD Verilen Windows komutunu çalıştırır.
  • : öldürmek PID (ler) Verilen tüm işlemleri öldür.
  • : q ,: çık NTop'tan çık.
  • / PATTERN,: arama PATTERN Bir arama yapın.
  • : sort COLUMN Verilen sütundan sonra işlem listesini sıralayın .
  • : ağaç İşlem ağacını görüntüle.

Önceden derlenmiş ikili dosyaları buradan indirebilirsiniz .


1
Bu konuda çözümün nasıl gerçekleştirileceğini açıklayabilir misiniz? Yorum gelen yazılım öneren İyi rehberlik burada
fixer1234

0

Aşağıdakileri ortam değişkeninizdeki mytop.ps1bir klasörde adı verilen bir dosyaya kaydedin PATH. Ardından herhangi bir PowerShell konsolundan aşağıdakilerden birini kullanın:

  1. mytop - 'Bellek' sütununa göre varsayılan sıralama kullanmak ve ilk 30 satırı göstermek için.
  2. mytop CPU 50 - 'CPU' sütununa göre sıralamak ve ilk 50 satırı göstermek için.
  3. While(1) {$p = myTop Memory 50; cls; $p} - saniyede bir yenilenmesini sağlamak.

mytop.ps1 içeriği:

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

Örnek çıktı:

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

Ek kredi:

  1. https://stackoverflow.com/a/55698377/5060792 için rokumaru
  2. LotPings için https://stackoverflow.com/a/55680398/5060792
  3. DBADon için https://stackoverflow.com/a/55697007/5060792


0

Aşağıdaki komutu kullanmanız size ilk 10 CPU kullanımını sağlayacak ve çıkış her 5 saniyede bir yenilenecektir.

süre (1) {ps | Sort-Object -Property işlemci-Düşen | -Birinci 10'u seç; Yazma-Ana Bilgisayarı "çıkışı 5 saniye içinde yenilenecektir nn Koll. uyku -İkinci 5}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.