คำสั่ง Linux“ ติดอันดับ” สำหรับ Windows Powershell?


61

ฉันกำลังมองหา PowerShell cmdlet ที่สามารถใช้งานคล้ายกับแอพ Linux Top สิ่งที่รีเฟรชในบางช่วงเวลาที่กำหนดและแสดงรายการกระบวนการด้วย CPU% util

ฉันเคยเห็นสคริปที่แสดงการใช้ CPU% ในวง แต่บางอย่างเช่นด้านบนจะมีประโยชน์มากกว่านี้เมื่อเราตั้งค่าการเข้าถึง SSH / Powershell สำหรับการจัดการ (ฉันยังชอบ putty shell!)


ตรงนี้อยู่ในหมวดหมู่ของคำถามsuperuser.com

Cool - ไม่ทราบว่าไซต์นั้นมีอยู่จริง! (ฉันเป็นผู้พัฒนา C # เป็นหลัก)

3
คุณสมบัติ CPU บน Process Object ไม่ใช่เปอร์เซ็นต์ของ CPU ซึ่งเป็นเวลารวมของ CPU ตั้งแต่เริ่มต้นกระบวนการ

คำตอบ:


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

เป็นซับง่าย ๆ ที่จะทำให้ฉลากอยู่ด้านบน

สิ่งนี้ทำงานได้เนื่องจากการจัดรูปแบบตารางโดยไม่มีพารามิเตอร์ใด ๆ เพียงแค่ดึงตารางเริ่มต้น ปรับขนาดอัตโนมัติจะใช้เพื่อปรับความกว้างคอลัมน์โดยอัตโนมัติเพื่อให้ข้อมูลทั้งหมดสามารถพอดีกับหน้าจอ

นี่คือรายละเอียดของคำสั่งสั้นที่ใช้

  • select -f เป็นทางลัดสำหรับ -first
  • ft เป็นทางลัดสำหรับ Format-Table
  • -a เป็นทางลัดสำหรับ - อัตโนมัติ
  • ค่าเริ่มต้นการนอนหลับที่จะใช้วินาที

2
CPUin psคือจำนวนวินาทีของการใช้ทั้งหมดไม่ใช่% CPU ดังนั้นนี่จึงไม่มีประโยชน์
Artyom

26

ไม่มีอะไรที่ฉันรู้ว่าในรูปแบบ cmdlet เดียว แต่อย่างที่คุณพูดสคริปต์ง่ายต่อการเขียนเพื่อเลียนแบบด้านบน

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

ใกล้พอ - ฉันสามารถปรับแต่งได้จากที่นี่ ... ทำได้ดีมาก! (ฉันเป็นนักพัฒนา C # แต่จัดการกับเซิร์ฟเวอร์ของเราด้วย - มาตามโค้ง PowerShell ... )

หากคุณต้องการเรียนรู้เพิ่มเติม - ตามตัวอย่าง - ดู 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 รายงานเวลา CPU ทั้งหมดตั้งแต่เริ่มต้นกระบวนการ นั่นไม่ได้มีประโยชน์บนเซิร์ฟเวอร์ของฉันที่ยังคงอยู่ 24/7 ซึ่งผลสูงสุดเป็นเพียงsvchostและsystemในหลายล้านวินาที True topหรือ Task Manager ที่เทียบเท่ากันจะให้ภาพรวมของการใช้งาน CPU ที่บันทึกไว้เมื่อเร็ว ๆ นี้ในช่วงเวลาที่กำหนดและ Get-Counter จะให้ข้อมูลนั้น เนื่องจากโพสต์ Superuser นี้ยังคงเป็นผลการค้นหาอันดับต้น ๆ ของ Google สำหรับ "powershell top" ฉันคิดว่าทางเลือกนี้คุ้มค่าที่จะมีส่วนร่วม

คำสั่งของฉันอยู่บนพื้นฐานของตัวอย่างที่ 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 แสดงในตารางที่จัดรูปแบบ

4
นี่คือคำตอบที่ดีที่สุด: Get-Counterให้ซีพียู "ทันใจ" แทนเวลา CPU สะสมจาก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 cmdlet ที่มีฟังก์ชั่นการใช้งาน มีคำสั่งภายนอกฟรีแวร์ที่ทำเกี่ยวกับสิ่งที่คุณต้องการ ดูpslistของ Mark Russinovich จากชุด Sysinternals Pslist จัดทำรายการกระบวนการดำเนินการในมุมมองที่กำหนดค่าได้ "pslist -s" ให้การเรียงลำดับของการอัปเดตอย่างต่อเนื่องที่คุณต้องการโดยมีอัตราการรีเฟรชเริ่มต้นหนึ่งครั้งต่อวินาที

ฉันชอบใช้ GUI Process Explorer ของ Mark แต่ 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 คุณสามารถใช้ 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

ความคิดเห็นจาก Mark ควรได้รับคำแนะนำเพิ่มเติมเพราะเกือบจะตรงตามที่คำถามเกิดขึ้นและใช้งานได้:

ให้ส่วนหัวที่ดีที่ด้านบนพร้อมการอัพเดททุกครั้งโดยไม่จำเป็นต้องล้างคอนโซลทั้งหมด

$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 และมีวิธีแก้ไขปัญหาทุกประเภท แต่ไม่มีสิ่งใดที่สวยงามและใกล้เคียงกับคำสั่งบนสุดของ linux

ขออภัยที่โพสต์แบบนี้ แต่เนื่องจากกฎ strikt ในที่นี่จึงเป็นไปไม่ได้ที่จะแสดงความคิดเห็นหรือจดบันทึกโดยไม่ต้องมี 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

คุณอาจต้องการเปิดใช้งานการตรวจสอบทรัพยากรจาก powershell ด้วย:

PS C:\>resmon

คุณสามารถปิดแอปพลิเคชันด้วย Alt + F4 และควรสลับโฟกัสกลับไปที่หน้าต่าง PowerShell


1
OP ต้องการใช้เซสชัน PowerShell ระยะไกลดังนั้นคำตอบ GUI ไม่พอดีที่นี่
PL

0

คุณสามารถลองใช้ทางเลือกใหม่สำหรับ Windows - NTop

จอภาพระบบเหมือน htop พร้อม Vi-emulation สำหรับ Windows เพราะการใช้ตัวจัดการงานนั้นไม่เจ๋งพอ

ป้อนคำอธิบายรูปภาพที่นี่

NTop เช่นเดียวกับใน Windows NT-op หรือ NukeTop สิ่งที่คุณต้องการ (หลังชัด)

ตัวเลือกบรรทัดคำสั่ง :

  • -Cใช้โทนสีขาวดำ
  • -hแสดงข้อมูลความช่วยเหลือ
  • -p PID, PID ... แสดงเฉพาะ PID ที่ระบุ
  • -s COLUMN เรียงลำดับตามคอลัมน์นี้
  • -u USERNAME แสดงเฉพาะกระบวนการที่เป็นของผู้ใช้รายนี้
  • -vรุ่นพิมพ์

คำสั่งแบบโต้ตอบ:

  • ลูกศรขึ้นและลง, PgUp และ PgDown, j และ k เลื่อนรายการกระบวนการ
  • CTRL + ลูกศรซ้ายและขวา เปลี่ยนคอลัมน์เรียงลำดับกระบวนการ
  • g ไปที่ด้านบนของรายการกระบวนการ
  • G ไปที่ด้านล่างของรายการกระบวนการ
  • Space Tag เป็นกระบวนการที่เลือก
  • U Untag กระบวนการที่ติดแท็กทั้งหมด
  • K ฆ่ากระบวนการที่ติดแท็กทั้งหมด
  • ฉัน สลับลำดับการจัดเรียง
  • F ติดตามกระบวนการ: ถ้าลำดับการจัดเรียงทำให้กระบวนการที่เลือกในปัจจุบันย้ายในรายการให้เลือกแถบทำตาม การเลื่อนเคอร์เซอร์ด้วยตนเองจะเป็นการปิดการใช้งานคุณสมบัตินี้โดยอัตโนมัติ
  • n ถัดไปในการค้นหา
  • N ก่อนหน้าในการค้นหา

คำสั่ง Vi :

  • : exec CMD เรียกใช้งานคำสั่ง Windows ที่ระบุ
  • : kill PID ฆ่ากระบวนการที่ให้มาทั้งหมด
  • : q ,: ออกจาก Quit NTop
  • / รูปแบบ: ค้นหา รูปแบบทำการค้นหา
  • : 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

ใช้คำสั่งด้านล่างมันจะให้การใช้งาน CPU สูงสุด 10 อันดับและการส่งออกจะถูกรีเฟรชทุกๆ 5 วินาที

ในขณะที่ (1) {ps | Sort-Object -Property cpu -Descending | เลือก -First 10; Write-Host "เอาต์พุตจะถูกรีเฟรชใน 5 วินาทีnn จัดการ NPM (K) PM (K) WS (K) CPU (s) Id SI ProcessName"; sleep - วินาที 5}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.