Lệnh Linux trên đỉnh của Linux cho Windows Powershell?


61

Tôi đang tìm kiếm một lệnh ghép ngắn PowerShell có thể cung cấp chức năng tương tự như ứng dụng Linux Top. Một cái gì đó làm mới tại một số khoảng thời gian nhất định và hiển thị danh sách quy trình với CPU% sử dụng.

Tôi đã thấy các tập lệnh liệt kê việc sử dụng CPU% trong một vòng lặp nhưng một cái gì đó như top sẽ tiện dụng hơn khi chúng tôi đã thiết lập quyền truy cập SSH / Powershell để quản lý (tôi vẫn thích trình bày putty!)


Điều này rơi thẳng vào danh mục câu hỏi superuser.com .

Cool -didnt nhận ra rằng trang web thậm chí còn tồn tại! (Tôi chủ yếu là nhà phát triển C #)

3
Thuộc tính CPU trên Object Object không phải là phần trăm CPU mà là tổng thời gian của CPU kể từ khi bắt đầu quá trình.

Câu trả lời:


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

Đây là một lớp lót đơn giản cũng sẽ giữ nhãn ở trên cùng.

Điều này hoạt động vì định dạng bảng mà không có bất kỳ tham số nào chỉ vẽ bảng mặc định. autosize được sử dụng để tự động điều chỉnh độ rộng cột để tất cả dữ liệu có thể vừa với màn hình.

Dưới đây là bảng phân tích các lệnh rút gọn được sử dụng

  • chọn -f là một phím tắt cho -first
  • ft là một phím tắt cho Format-Table
  • -a là một phím tắt cho -autosize
  • mặc định ngủ để sử dụng giây

2
CPUtính bằng pssố giây của tổng số lần sử dụng, không phải% CPU. Vì vậy, điều này là không hữu ích.
Artyom

26

Không có gì mà tôi biết về điều đó ở dạng cmdlet đơn lẻ, nhưng như bạn nói, các tập lệnh rất dễ viết để mô phỏng hàng đầu.

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

đủ gần - tôi có thể tinh chỉnh nó từ đây ... tốt, xong! (Tôi là nhà phát triển C #, nhưng cũng quản lý các máy chủ của chúng tôi - vì vậy sẽ xuất hiện đường cong PowerShell ...)

nếu bạn muốn tìm hiểu thêm - ví dụ - hãy xem www.posehcode.org
x0n

@TimAtVenturality - Bạn có thể gói tập lệnh dưới dạng hàm với các tham số để sao chép chặt chẽ hơn hàng đầu.
Joe Internet

17

Một giải pháp tương tự như các giải pháp khác, nhưng sử dụng Get-Counter thay vì Get-Process.

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

Đầu ra mẫu:

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

Tôi đã tìm thấy hầu hết các giải pháp khác ở đây bằng cách sử dụng báo cáo quy trình get tổng thời gian CPU kể từ khi bắt đầu quá trình. Điều đó không hữu ích trên máy chủ của tôi, hoạt động liên tục 24/7, trong đó kết quả hàng đầu luôn luôn chỉ svchostsystemhàng triệu giây. Một trình topquản lý tác vụ thực sự hoặc tương đương sẽ cung cấp một ảnh chụp nhanh về việc sử dụng CPU được ghi lại gần đây trong một khoảng thời gian cố định và Get-Counter cung cấp điều đó. Vì bài đăng Superuser này vẫn là kết quả hàng đầu của Google cho "powershell top", tôi cho rằng sự thay thế này rất đáng để đóng góp.

Lệnh của tôi dựa trên ví dụ 13 từ các tài liệu Get-Counter: https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Diagnostics/Get-Count .
Đây là sự cố của một lớp lót để bạn có thể dễ dàng sửa đổi nó theo nhu cầu của mình:

  • While(1) { chỉ cần vòng lặp nó
  • get-counter '\Process(*)\% Processor Time'chọn dữ liệu% CPU. Lệnh này dường như mất một khoảng thời gian đáng kể để quay lại, vì vậy không cần phảisleep
  • cls rõ ràng cho bảng mới
  • sort -des CookedValue CookedValue là lĩnh vực chúng tôi quan tâm, sắp xếp để đặt lớn nhất lên hàng đầu
  • select -f 15 hiển thị 15 đầu tiên
  • ft -a hiển thị trong bảng định dạng

4
Đây là câu trả lời tốt nhất: Get-Countercung cấp cho bạn CPU "tức thời", thay vì thời gian CPU tích lũy từ đó ps. Định dạng tốt hơn : 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

Cung cấp các tiêu đề đẹp ở đầu với mỗi bản cập nhật mà không cần phải xóa toàn bộ giao diện điều khiển.

$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

Tôi không biết về lệnh ghép ngắn PowerShell cung cấp chức năng. Có một lệnh bên ngoài phần mềm miễn phí thực hiện về những gì bạn muốn. Nhìn vào Mark Russinovich pslist từ bộ ứng dụng Sysinternals. Pslist cung cấp một danh sách các quá trình thực thi trong một khung nhìn có thể cấu hình. "pslist -s" cung cấp loại cập nhật liên tục mà bạn muốn, với tốc độ làm mới mặc định là một lần mỗi giây.

Tôi thích sử dụng GUI Process Explorer của Mark, nhưng pslist rất tiện cho các phiên giao diện điều khiển.

Trang chủ của Sysiternals có tại đây: http://technet.microsoft.com/en-us/sysiternals

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

Đây chỉ là một cách đẹp hơn một chút, vì bạn có thể thấy các tiêu đề lên trên mỗi lần


1

Ngoài ra, tôi muốn chỉ ra rằng nếu bạn muốn một môi trường giống như linux cho Windows, bạn có thể sử dụng Cygwin. Nó mang đến môi trường Linux cho Windows. Bạn có thể sử dụng hầu hết mọi lệnh. Không chắc chắn làm thế nào hữu ích cho bạn mặc dù.

http://www.cygwin.com/


1

Điều này cũng có thể thực hiện các mẹo:

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

Hàm này dựa trên các Get-Countermẫu và sẽ xuất ra ProcessId,ProcessName,ProcessorUsageWorkingSet. Mẫu truy cập này có thể được tăng cường hơn nữa để bao gồm User, CommandLinetrong đầu ra nhưng tôi chưa tìm ra cách nào để thực hiện nó.


1

Nhận xét này từ Mark sẽ nhận được nhiều khuyến nghị hơn, bởi vì nó gần như chính xác câu hỏi là gì và nó hoạt động:

Cung cấp các tiêu đề đẹp ở đầu với mỗi bản cập nhật mà không cần phải xóa toàn bộ giao diện điều khiển.

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

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

(liên kết đến nhận xét: https://superuser.com/a/770455/989044 )

Bạn nên tạo một mô-đun đơn giản cho nó và lưu trữ trên github hoặc cung cấp cho choco. Tôi nghĩ rằng nó nên là một mô-đun nổi bật ngay từ đầu, bởi vì nó được tìm kiếm rất nhiều trên google và có tất cả các cách giải quyết nhưng không ai trong số chúng rất thanh lịch và gần với lệnh hàng đầu của linux.

Xin lỗi vì đã đăng nó như thế này, nhưng vì các quy tắc đình công ở đây nên không thể bình luận hoặc ghi chú mà không có 50 nghiệp.


0

Để chạy top trực tiếp từ cmd, bạn sẽ cần tạo tệp% WINDIR% \ top.bat với mã này:

@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

Nếu bạn muốn lọc theo quy trình, hãy sử dụng findstr

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

0

Bạn có thể muốn khởi chạy trình giám sát tài nguyên từ powershell với:

PS C:\>resmon

Bạn luôn có thể đóng ứng dụng bằng Alt + F4 và điều đó sẽ chuyển trọng tâm trở lại cửa sổ powershell.


1
OP muốn sử dụng các phiên quyền hạn từ xa, vì vậy câu trả lời GUI không phù hợp ở đây.
PL

0

Bạn có thể thử thay thế htop cho windows - NTop

màn hình hệ thống giống như htop với mô phỏng Vi cho Windows. Bởi vì sử dụng Trình quản lý tác vụ không đủ mát.

nhập mô tả hình ảnh ở đây

NTop như trong Windows NT-op hoặc NukeTop. Bất cứ điều gì bạn thích (sau này rõ ràng).

Tùy chọn dòng lệnh :

  • -C Sử dụng bảng màu đơn sắc.
  • -h Hiển thị thông tin trợ giúp.
  • -p PID, PID ... Chỉ hiển thị các PID đã cho.
  • -s COLUMN Sắp xếp theo cột này.
  • -u USERNAME Chỉ hiển thị các quy trình thuộc về người dùng này.
  • -v Phiên bản in.

Các lệnh tương tác:

  • Mũi tên Lên và Xuống, PGUp và PGDown, j và k Cuộn danh sách quy trình.
  • CTRL + Mũi tên trái và phải Thay đổi cột sắp xếp quá trình.
  • g Đi đến đầu danh sách quy trình.
  • G Đi đến cuối danh sách quy trình.
  • Thẻ không gian một quy trình được chọn.
  • U Untag tất cả các quy trình được gắn thẻ.
  • K Giết tất cả các quy trình được gắn thẻ.
  • Tôi đảo ngược thứ tự sắp xếp.
  • F Thực hiện theo quy trình: nếu thứ tự sắp xếp khiến quy trình hiện được chọn di chuyển trong danh sách, hãy tạo thanh lựa chọn theo nó. Di chuyển con trỏ tự động vô hiệu hóa tính năng này.
  • n Tiếp theo trong tìm kiếm.
  • N Trước khi tìm kiếm.

Lệnh Vi :

  • : exec CMD Thực thi lệnh Windows đã cho.
  • : kill PID (s) Kill tất cả các tiến trình đã cho.
  • : q ,: bỏ Thoát NTop.
  • / THỰC TRẠNG ,: tìm kiếm THỰC HIỆN Thực hiện tìm kiếm.
  • : sort COLUMN Sắp xếp danh sách quy trình sau cột đã cho.
  • : cây Xem quy trình cây.

Các tệp nhị phân được biên dịch sẵn có thể được tải xuống ở đây


1
Bạn có thể giải thích làm thế nào để thực hiện giải pháp với điều này? từ đánh giá Hướng dẫn tốt về đề xuất phần mềm tại đây
fixer1234

0

Lưu các mục sau trong một tệp được gọi mytop.ps1trong một thư mục nằm trong PATHbiến môi trường của bạn . Sau đó, sử dụng một trong những điều sau đây từ bất kỳ bảng điều khiển PowerShell nào:

  1. mytop - để sử dụng sắp xếp mặc định theo cột 'Bộ nhớ' và hiển thị 30 dòng đầu tiên.
  2. mytop CPU 50 - để sắp xếp theo cột 'CPU' và hiển thị 50 dòng đầu tiên.
  3. While(1) {$p = myTop Memory 50; cls; $p} - để làm mới nó mỗi giây hoặc lâu hơn.

mytop.ps1 nội dung:

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

Ví dụ đầu ra:

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

Tín dụng bổ sung vào:

  1. rokumaru cho https://stackoverflow.com/a/55698377/5060792
  2. Xổ số cho https://stackoverflow.com/a/55680398/5060792
  3. DBADon cho https://stackoverflow.com/a/55697007/5060792


0

Sử dụng lệnh bên dưới, nó sẽ cung cấp cho bạn 10 mức sử dụng CPU hàng đầu và đầu ra sẽ được làm mới cứ sau 5 giây

trong khi (1) {ps | Sắp xếp-Object -Property cpu -Desceinating | select -First 10; Write-Host "sẽ được làm mới trong 5 giây nn Handles NPM (K) PM (K) WS (K) CPU (s) Id SI ProcessName"; ngủ-giây thứ 5}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.