Windows Powershell 용 Linux“Top”명령?


61

Linux Top 앱과 유사한 기능을 제공 할 수있는 PowerShell cmdlet을 찾고 있습니다. 일정한 간격으로 새로 고쳐 CPU % util과 함께 프로세스 목록을 표시하는 것.

루프에서 CPU 사용률을 나열하는 스크립트를 보았지만 관리를 위해 SSH / Powershell 액세스를 설정하면 top과 같은 것이 더 편리합니다 (여전히 퍼티 쉘을 선호합니다!)


이것은 superuser.com 범주의 질문에 해당합니다.

멋진 사이트는 심지어 사이트가 존재한다는 것을 알고 있습니다! (나는 주로 C #을 개발자입니다)

3
프로세스 오브젝트의 CPU 특성은 CPU 백분율이 아니며 프로세스 시작 이후의 총 CPU 시간입니다.

답변:


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

이것은 레이블을 맨 위에 유지하는 간단한 라이너입니다.

매개 변수없이 테이블을 포맷하면 기본 테이블이 그려지기 때문에 작동합니다. autosize는 모든 데이터가 화면에 맞도록 열 너비를 자동으로 조정하는 데 사용됩니다.

사용 된 단축 명령에 대한 분석은 다음과 같습니다.

  • -f는 -first의 단축키입니다.
  • ft는 Format-Table의 단축키입니다.
  • -a는 -autosize의 단축키입니다.
  • 수면의 기본값은 초를 사용하는 것입니다

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

16

다른 솔루션과 유사하지만 Get-Process 대신 Get-Counter를 사용합니다.

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 report를 사용하여 프로세스 시작 이후 총 CPU 시간을 사용하여 다른 솔루션의 대부분을 찾았습니다. 즉, 상위 결과가 단지 언제나 24 시간을 유지 내 서버에 대한 유용한 아니었다 svchostsystem초 수백만에서. true top또는 작업 관리자에 해당하는 것은 일정 시간 동안 최근에 기록 된 CPU 사용량의 스냅 샷을 제공하며 Get-Counter가 제공합니다. 이 수퍼 유저 게시물은 여전히 ​​"powershell top"에 대한 Google의 최고 결과이므로이 대안이 기여할 가치가 있다고 생각했습니다.

내 명령은 Get-Counter 문서 ( https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Diagnostics/Get-Counter) 의 예제 13을 기반으로 합니다.
다음은 one-liner의 세부 사항으로, 필요에 따라보다 쉽게 ​​수정할 수 있습니다.

  • While(1) { 그냥 루프
  • get-counter '\Process(*)\% Processor Time'CPU % 데이터를 선택합니다. 이 명령은 돌아 오는 데 상당한 시간이 걸리는 것 같습니다.sleep
  • cls 새 테이블을 지우다
  • sort -des CookedValue CookedValue는 우리가 정직한 분야입니다.
  • select -f 15 처음 표시 15
  • ft -a 형식화 된 테이블에 표시

4
이것이 가장 좋은 대답입니다. Get-Counter에서 누적 CPU 시간이 아닌 "즉시"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에 대해 잘 모르겠습니다. 원하는 작업을 수행하는 프리웨어 외부 명령이 있습니다. Sysinternals 제품군 의 Mark Russinovich의 pslist 를 보십시오 . Pslist는 구성 가능한보기에서 실행중인 프로세스 목록을 제공합니다. "pslist -s"는 초당 1 회 기본 새로 고침 빈도로 원하는 종류의 연속 업데이트를 제공합니다.

Mark의 GUI Process Explorer를 선호하지만 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 환경을 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,ProcessorUsageWorkingSet. 이 카운터 샘플 더 포함하도록 향상 될 수있다 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를 제공해야합니다. 나는 그것이 구글에서 심하게 검색되었고 모든 종류의 해결 방법이 있기 때문에 처음에는 표준 모듈이어야한다고 생각하지만 그중에서도 우아하고 리눅스 최고 명령에 가깝지는 않습니다.

이렇게 게시 해 주셔서 죄송합니다. 여기에있는 엄격한 규칙으로 인해 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를 사용하여 언제든지 응용 프로그램을 닫을 수 있으며 포커스를 다시 파워 쉘 창으로 전환해야합니다.


1
OP는 원격 Powershell 세션을 사용하려고하므로 GUI 답변이 여기에 맞지 않습니다.
PL

0

창문 대신에 다른 대안을 시도 할 수 있습니다 -NTop

Windows 용 Vi-emulation이 포함 된 htop 형 시스템 모니터 작업 관리자를 사용하는 것만으로는 충분하지 않습니다.

여기에 이미지 설명을 입력하십시오

Windows NT-op 또는 NukeTop과 같은 NTop. 당신이 선호하는 것이 무엇이든 (후자는 분명히).

명령 줄 옵션 :

  • -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, : quit NTop을 종료합니다.
  • / PATTERN, : search PATTERN 검색합니다.
  • : sort COLUMN 주어진 열 다음에 프로세스 목록을 정렬합니다.
  • : tree 프로세스 트리를 봅니다.

사전 컴파일 된 바이너리는 여기에서 다운로드 할 수 있습니다


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} -1 초마다 새로 고침합니다.

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. 로쿠 마르 에 대한 https://stackoverflow.com/a/55698377/5060792
  2. LotPings 에 대한 https://stackoverflow.com/a/55680398/5060792
  3. https://stackoverflow.com/a/55697007/5060792DBADon


0

아래 명령을 사용하면 CPU 사용률이 가장 높고 5 초마다 출력이 새로 고쳐집니다.

while (1) {ps | Sort-Object -Property cpu-내림차순 | select -First 10; Write-Host "출력은 5 초 후 새로 고쳐집니다. nnPM (K) PM (K) WS (K) CPU ID SI SI 이름을 처리합니다."; 수면-두 번째 5}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.