Linux Top 앱과 유사한 기능을 제공 할 수있는 PowerShell cmdlet을 찾고 있습니다. 일정한 간격으로 새로 고쳐 CPU % util과 함께 프로세스 목록을 표시하는 것.
루프에서 CPU 사용률을 나열하는 스크립트를 보았지만 관리를 위해 SSH / Powershell 액세스를 설정하면 top과 같은 것이 더 편리합니다 (여전히 퍼티 쉘을 선호합니다!)
Linux Top 앱과 유사한 기능을 제공 할 수있는 PowerShell cmdlet을 찾고 있습니다. 일정한 간격으로 새로 고쳐 CPU % util과 함께 프로세스 목록을 표시하는 것.
루프에서 CPU 사용률을 나열하는 스크립트를 보았지만 관리를 위해 SSH / Powershell 액세스를 설정하면 top과 같은 것이 더 편리합니다 (여전히 퍼티 쉘을 선호합니다!)
답변:
While(1) {ps | sort -des cpu | select -f 15 | ft -a; sleep 1; cls}
이것은 레이블을 맨 위에 유지하는 간단한 라이너입니다.
매개 변수없이 테이블을 포맷하면 기본 테이블이 그려지기 때문에 작동합니다. autosize는 모든 데이터가 화면에 맞도록 열 너비를 자동으로 조정하는 데 사용됩니다.
사용 된 단축 명령에 대한 분석은 다음과 같습니다.
CPU
in ps
은 CPU 사용률이 아닌 총 사용량 (초)입니다. 그래서 이것은 유용하지 않습니다.
단일 cmdlet 형식으로 알 수있는 것은 없지만 스크립트를 작성하면 상단을 에뮬레이트하기가 쉽습니다.
while (1) { ps | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
다른 솔루션과 유사하지만 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 시간을 유지 내 서버에 대한 유용한 아니었다 svchost
및 system
초 수백만에서. 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
처음 표시 15ft -a
형식화 된 테이블에 표시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
기능을 제공하는 PowerShell cmdlet에 대해 잘 모르겠습니다. 원하는 작업을 수행하는 프리웨어 외부 명령이 있습니다. Sysinternals 제품군 의 Mark Russinovich의 pslist 를 보십시오 . Pslist는 구성 가능한보기에서 실행중인 프로세스 목록을 제공합니다. "pslist -s"는 초당 1 회 기본 새로 고침 빈도로 원하는 종류의 연속 업데이트를 제공합니다.
Mark의 GUI Process Explorer를 선호하지만 pslist는 콘솔 세션에 편리합니다.
Sysinternals 홈페이지는 다음과 같습니다 : http://technet.microsoft.com/en-us/sysinternals
데니스
또한 Windows 용 Linux와 같은 환경을 원한다면 Cygwin을 사용할 수 있다고 지적하고 싶습니다. Linux 환경을 Windows로 가져옵니다. 거의 모든 명령을 사용할 수 있습니다. 이것이 당신에게 얼마나 유용한 지 잘 모르겠습니다.
이것은 또한 트릭을 할 수 있습니다 :
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
출력에하지만 난 그것을 할 아직 성능이 좋은 방법을 일을하지 않았습니다.
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 개의 업장이 없으면 메모하거나 메모 할 수 없습니다.
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}}"
프로세스별로 필터링하려면 findstr을 사용하십시오.
while (1) { ps | findstr explorer | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
다음을 사용하여 powershell에서 리소스 모니터를 시작할 수 있습니다.
PS C:\>resmon
Alt + F4를 사용하여 언제든지 응용 프로그램을 닫을 수 있으며 포커스를 다시 파워 쉘 창으로 전환해야합니다.
창문 대신에 다른 대안을 시도 할 수 있습니다 -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 프로세스 트리를 봅니다.
사전 컴파일 된 바이너리는 여기에서 다운로드 할 수 있습니다
환경 변수 mytop.ps1
에있는 폴더 에있는 파일에 다음을 저장하십시오 PATH
. 그런 다음 PowerShell 콘솔에서 다음 중 하나를 사용하십시오.
mytop
- '메모리'열을 기준으로 기본 정렬을 사용하고 처음 30 행을 표시합니다.mytop CPU 50
- 'CPU'열을 기준으로 정렬하고 처음 50 줄을 표시합니다.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
추가 크레딧 :
다른 볼거리는 :
https://docs.microsoft.com/en-us/sysinternals/downloads/process-utilities
모든 프로세스 (물론 프로세스 모니터 또는 프로세스 탐색기)를 덤프하는 명령 행 도구가 있습니다.
아래 명령을 사용하면 CPU 사용률이 가장 높고 5 초마다 출력이 새로 고쳐집니다.
while (1) {ps | Sort-Object -Property cpu-내림차순 | select -First 10; Write-Host "출력은 5 초 후 새로 고쳐집니다. n
nPM (K) PM (K) WS (K) CPU ID SI SI 이름을 처리합니다."; 수면-두 번째 5}