Windows Powershell用のLinux「Top」コマンド?


61

Linux Topアプリと同様の機能を提供できるPowerShellコマンドレットを探しています。特定の間隔で更新され、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は、すべてのデータが画面に収まるように列幅を自動的に調整するために使用されます。

使用されている短縮コマンドの内訳は次のとおりです

  • select -fは-firstのショートカットです
  • ftはFormat-Tableのショートカットです
  • -aは-autosizeのショートカットです
  • スリープはデフォルトで秒を使用します

2
CPUin psはCPU使用率ではなく、合計使用時間の秒数です。したがって、これはあまり役に立ちません。
Artyom

26

単一のコマンドレット形式で私が知っていることは何もありませんが、あなたが言うように、スクリプトはtopをエミュレートするために書くのは簡単です。

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

十分に近い-ここから調整できます... (私はC#開発者ですが、サーバーも管理しているため、PowerShell曲線を作成しています...)

詳細を知りたい場合-例-www.poshcode.org
x0n

@TimAtVenturality-topをより厳密に複製するために、スクリプトをパラメーター付きの関数としてラップできます。
ジョーインターネット

17

他と同様のソリューションですが、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レポートを使用して、プロセスの開始以降の合計CPU時間を報告する他のほとんどのソリューションを見つけました。それはトップの結果は常にだけだっ24/7まで滞在することを自分のサーバー上で有用ではありませんでしたsvchostし、system秒の何百万人で。真のtopタスクマネージャーまたは同等のタスクマネージャーは、最近一定の期間にわたって記録されたCPU使用率のスナップショットを提供し、Get-Counterはそれを提供します。このSuperuserの投稿は、まだ「powershell top」のGoogleの最高の結果であるため、この代替案は貢献する価値があると考えました。

私のコマンドはGet-カウンタードキュメントから例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は、私たちがテストしているフィールドで、最大のものを上に並べます
  • 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コマンドレットを知りません。あなたが望むことを行うフリーウェアの外部コマンドがあります。SysinternalsスイートのMark Russinovichのpslistを見てください。Pslistは、実行可能なプロセスのリストを構成可能なビューで提供します。「pslist -s」は、1秒間に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。このカウンタサンプルはさらに含むように拡張することができUserCommandLine出力ではなく、私はそれを行うには、まだパフォーマンスの方法を働いていません。


1

マークからの次のコメントは、質問がほぼ正確に実行され、機能するため、より多くの推奨事項を取得する必要があります。

コンソール全体をクリアする必要なく、すべての更新で上部に素敵な見出しを提供します。

$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コマンドに近いため、そもそも標準モジュールであると思います。

このように投稿してすみませんが、ここの厳しい規則のために、50カルマほどなくしてコメントしたりメモしたりすることはできません。


0

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

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のhtop-alternativeを試すことができます-NTop

Windows用のViエミュレーションを備えた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. rokumaruためhttps://stackoverflow.com/a/55698377/5060792
  2. LotPingsためhttps://stackoverflow.com/a/55680398/5060792
  3. DBADonためhttps://stackoverflow.com/a/55697007/5060792


0

以下のコマンドを使用すると、トップ10のCPU使用率が得られ、出力は5秒ごとに更新されます

while(1){ps | Sort-Object -Property cpu -Descending | select -First 10; Write-Host "出力は5秒のnnで更新されますnハンドルNPM(K)PM(K)WS(K)CPU(s)Id SI ProcessName"; 睡眠-秒5}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.