web-dev-qa-db-ja.com

Windows Powershell用のLinuxの "トップ"コマンド?

Linux Topアプリと同様の機能を提供できるPowerShellコマンドレットを探しています。一定の間隔で更新され、CPU%utilのプロセスリストを表示するもの。

ループでCPU使用率をリストするスクリプトを見たことがありますが、管理のためにSSH/Powershellアクセスを設定しているのでtopのようなものはもっと便利でしょう(私はまだPuTTYシェルを好む!)

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

これは、ラベルを上部に保持する簡単なワンライナーです。

これは、パラメータなしでテーブルをフォーマットすると、デフォルトのテーブルだけが描画されるためです。自動サイズ調整は、すべてのデータが画面に収まるように列幅を自動的に調整するために使用されます。

これは使用された短縮されたコマンドの内訳です

  • select -fは-firstのショートカットです。
  • ftはFormat-Tableのショートカットです
  • -aは-autosizeのショートカットです
  • sleepはデフォルトでsecondsを使用します
33
user1820024

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

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

他のソリューションと似ていますが、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日稼働している私のサーバーでは、何百万もの秒で常にsvchostsystemになってしまいました。真の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最初の表示15
  • ft -aをフォーマットされた表に表示
13
fireforge124

コンソール全体をクリアしなくても、更新ごとに上部に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)
}
6
Mark

機能を提供するPowerShellコマンドレットを知りません。あなたが欲しいものについて行うフリーウェア外部コマンドがあります。 Sysinternals SuiteのMark Russinovichのpslistをご覧ください。 Pslistは構成可能なビューで実行中のプロセスのリストを提供します。 「pslist -s」は、1秒に1回のデフォルトのリフレッシュレートで、必要な種類の継続的な更新を提供します。

MarkのGUI Process Explorerを使うのが好きですが、pslistはコンソールセッションには便利です。

Sysinternalsのホームページは次のとおりです。 http://technet.Microsoft.com/ja-jp/sysinternals

デニス

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

毎回見出しが上に表示されるようになるので、これはほんの少し良い方法です。

2
Ross Wiley

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カルマなどなしでコメントしたりメモをしたりすることは不可能です。

1
Matthi _

これもトリックをするかもしれません:

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
Hames

また、私はあなたがWindows用のLinuxのような環境が欲しいならCygwinを使うことができることを指摘したい。それはLinux環境をWindowsにもたらします。ほとんどすべてのコマンドを使用できます。これがあなたにとってどれほど役に立つのかわからない。

http://www.cygwin.com/

1
Josiah

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

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

0
user1057886

次のようにして、powershellからリソースモニターを起動します。

PS C:\>resmon

あなたはいつでもAlt + F4でアプリケーションを閉じることができます、そしてそれはパワーシェルウィンドウにフォーカスを戻すべきです。

0
Albino Cordeiro

以下をPATH環境変数にあるフォルダーのmytop.ps1というファイルに保存します。その後、任意のPowerShellコンソールから次のいずれかを使用します。

  1. mytop - デフォルトの 'Memory'列によるソートを使用し、最初の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. rokumaruhttps://stackoverflow.com/a/55698377/5060792
  2. LotPingshttps://stackoverflow.com/a/55680398/5060792
  3. DBADonhttps://stackoverflow.com/a/55697007/5060792
0
Clay

プロセスでフィルタリングしたい場合は、findstrを使用してください。

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

あなたは窓のためのhtop-alternativeを試すことができます - NTop

windows用のViエミュレーションを備えたhtop風のシステムモニタ。タスクマネージャを使用するのは十分クールではないからです。

enter image description here

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プロセスツリーを表示します。

プリコンパイルされたバイナリはこちらからダウンロードできます

0
Geograph

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
user374797

他に見るべきことは、次のとおりです。

https://docs.Microsoft.com/ja-jp/sysinternals/downloads/process-utilities

すべてのプロセスをダンプするためのコマンドラインツールがあります(もちろんProcess MonitorまたはProcess Explorerもあります)。

0
Mark Manning