Linux Topアプリと同様の機能を提供できるPowerShellコマンドレットを探しています。一定の間隔で更新され、CPU%utilのプロセスリストを表示するもの。
ループでCPU使用率をリストするスクリプトを見たことがありますが、管理のためにSSH/Powershellアクセスを設定しているのでtopのようなものはもっと便利でしょう(私はまだPuTTYシェルを好む!)
While(1) {ps | sort -des cpu | select -f 15 | ft -a; sleep 1; cls}
これは、ラベルを上部に保持する簡単なワンライナーです。
これは、パラメータなしでテーブルをフォーマットすると、デフォルトのテーブルだけが描画されるためです。自動サイズ調整は、すべてのデータが画面に収まるように列幅を自動的に調整するために使用されます。
これは使用された短縮されたコマンドの内訳です
単一のコマンドレット形式でそのことを私が知っていることは何もありませんが、あなたが言うように、スクリプトはtopをエミュレートするのが簡単です。
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時間365日稼働している私のサーバーでは、何百万もの秒で常にsvchost
とsystem
になってしまいました。真のtop
またはタスクマネージャと同等のものは、ある一定期間にわたって最近記録されたCPU使用率のスナップショットを提供し、Get-Counterはそれを提供します。このスーパーユーザー投稿はまだ「powershell top」のトップGoogleの結果であるので、私はこの代替案が貢献する価値があると考えました。
私のコマンドはGet-Counterドキュメントの例13に基づいています。 https://docs.Microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Diagnostics/Get-Counter .
ワンライナーの内訳は次のとおりです。ニーズに合わせて簡単に変更できます。
While(1) {
はそれをループするだけですget-counter '\Process(*)\% Processor Time'
はCPU%データを選択します。このコマンドは返されるまでにかなりの時間がかかるように思われるので、_ sleep
_する必要はありませんcls
は新しいテーブルをクリアしますsort -des CookedValue
CookedValueは私たちが興味を持っている分野です。select -f 15
最初の表示15ft -a
をフォーマットされた表に表示コンソール全体をクリアしなくても、更新ごとに上部にNice見出しが表示されます。
$saveY = [console]::CursorTop
$saveX = [console]::CursorLeft
while ($true) {
Get-Process | Sort -Descending CPU | Select -First 30;
Sleep -Seconds 2;
[console]::setcursorposition($saveX,$saveY+3)
}
機能を提供するPowerShellコマンドレットを知りません。あなたが欲しいものについて行うフリーウェア外部コマンドがあります。 Sysinternals SuiteのMark Russinovichのpslistをご覧ください。 Pslistは構成可能なビューで実行中のプロセスのリストを提供します。 「pslist -s」は、1秒に1回のデフォルトのリフレッシュレートで、必要な種類の継続的な更新を提供します。
MarkのGUI Process Explorerを使うのが好きですが、pslistはコンソールセッションには便利です。
Sysinternalsのホームページは次のとおりです。 http://technet.Microsoft.com/ja-jp/sysinternals
デニス
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 "------- ------ ----- ----- ----- ------ -- -----------"}
毎回見出しが上に表示されるようになるので、これはほんの少し良い方法です。
Markからのこのコメントはより多くの推薦を得るべきです、なぜならそれは質問がだいたい正確にしていて、そしてそれがうまくいく:
コンソール全体をクリアしなくても、更新ごとに上部にNice見出しが表示されます。
$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でそれを提供するべきです。そもそもそれはグーグルで検索され、いろいろな種類の回避策があるのでそれは標準的なモジュールであるべきだと思いますが、どれもそれほどエレガントでlinux topコマンドに近いものはありません。
このような投稿をして申し訳ありませんが、ここでのStriktルールのために50カルマなどなしでコメントしたりメモをしたりすることは不可能です。
これもトリックをするかもしれません:
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
を含めるようにさらに拡張することができますが、それを実行するための効率的な方法はまだ得られていません。
また、私はあなたがWindows用のLinuxのような環境が欲しいならCygwinを使うことができることを指摘したい。それはLinux環境をWindowsにもたらします。ほとんどすべてのコマンドを使用できます。これがあなたにとってどれほど役に立つのかわからない。
以下のコマンドを使用すると、トップ10のCPU使用率が得られ、5秒ごとに出力が更新されます
while(1){ps | Sort-Object -Property cpu -Descending | select -First 10; Write-Host "出力は5秒で更新されますn
n NPM(K)PM(K)WS(K)CPU Id SI ProcessNameを処理します";睡眠-秒5}
次のようにして、powershellからリソースモニターを起動します。
PS C:\>resmon
あなたはいつでもAlt + F4でアプリケーションを閉じることができます、そしてそれはパワーシェルウィンドウにフォーカスを戻すべきです。
以下をPATH
環境変数にあるフォルダーのmytop.ps1
というファイルに保存します。その後、任意のPowerShellコンソールから次のいずれかを使用します。
mytop
- デフォルトの 'Memory'列によるソートを使用し、最初の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
追加クレジット:
プロセスでフィルタリングしたい場合は、findstrを使用してください。
while (1) { ps | findstr Explorer | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
あなたは窓のためのhtop-alternativeを試すことができます - NTop
windows用のViエミュレーションを備えたhtop風のシステムモニタ。タスクマネージャを使用するのは十分クールではないからです。
Windows NT-opまたはNukeTopのようにNTop。あなたが好むものは何でも(後者は明らかに)。
コマンドラインオプション:
- - Cモノクロカラースキームを使用します。
- - hヘルプ情報を表示します。
- - pPID、PID ...与えられたPIDだけを表示します。
- - sCOLUMNこの列でソートします。
- - uUSERNAMEこのユーザーに属するプロセスのみを表示します。
- - v印刷バージョン。
対話式コマンド:
- 上下の矢印、PgUpとPgDown、jとkプロセスリストをスクロールします。
- CTRL +左右矢印プロセスソート列を変更します。
- gプロセスリストの先頭に移動します。
- Gプロセスリストの一番下に移動します。
- スペース選択したプロセスにタグを付けます。
- Uタグ付きプロセスすべてのタグを解除します。
- Kタグ付きプロセスをすべて終了します。
- Iソート順を逆にします。
- Fプロセスに従う:ソート順によって現在選択されているプロセスがリスト内で移動する場合は、選択バーをそれに従ってください。手動でカーソルを移動すると、この機能は自動的に無効になります。
- n次に検索します。
- N前の検索。
Viコマンド:
- :exec CMD指定されたWindowsコマンドを実行します。
- :PIDをkill与えられたすべてのプロセスを終了させます。
- :q、:quitNTopを終了します。
- / PATTERN、:search PATTERN検索します。
- :sort COLUMN指定された列の後のプロセスリストをソートします。
- :treeプロセスツリーを表示します。
プリコンパイルされたバイナリはこちらからダウンロードできます
Cmdから直接topを実行するには、次のコードでファイル%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}}"
他に見るべきことは、次のとおりです。
https://docs.Microsoft.com/ja-jp/sysinternals/downloads/process-utilities
すべてのプロセスをダンプするためのコマンドラインツールがあります(もちろんProcess MonitorまたはProcess Explorerもあります)。