【Get-Process】PowerShellでプロセス取得する方法は?その見方は?

こんにちは。チェシャ男です。(-皿-)

今回は、

【PowerShell で実行中のプロセスを確認する方法】

についてご紹介します。

今回紹介する ”Get-Process” コマンドレットではマシン上で実行されているプロセスに関する情報を簡単に取得できます。

実行中のプログラムを確認する場合やプログラムがどれくらいリソースを消費しているかなどを確認することができます。

別プロセスを新たに起動する方法についてはこちら↓をご参考ください。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/start-process/”]

Get-Process で実行中のプロセスを確認する

実行中のプロセスを取得するコマンドレットに

Get-Process(→ コマンドレットの詳細はこちら

というものがあります。

【コマンドレット】

Get-Process

【オプション】

パターン1(プロセス名から取得)
-Name               <プロセス名(複数可)>
-ComputerName <マシン名やIPアドレス>
-Module
-FileVersionInfo

パターン2(プロセスIDから取得)
-Id                     <プロセスのID(複数可)>
-ComputerName <マシン名やIPアドレス>
-Module
-FileVersionInfo

パターン3(プロセスオブジェクトから取得)
-InputObject       <プロセスのオブジェクト>
-ComputerName <マシン名やIPアドレス>
-Module
-FileVersionInfo

[v4,v5以降]
-IncludeUserName

【入力】

System.String[] System.Int32[] System.Diagnostics.Process[]

【出力】

System.Diagnostics.ProcessModule
System.Diagnostics.FileVersionInfo
System.Diagnostics.Process

【エイリアス】

ps
gps

プロセスとは…

プロセスとは簡単に言うと「実行中のプログラム」の事を指します。

コンピュータの中には様々なソフトウェアプログラムの実行ファイル(.exeファイルなど)が存在します。これらが起動されると「メモリ」の中に読み込まれます。

このメモリに読み込まれ実行中となったプログラムの事を「プロセス」と言います。

プログラムには「データがどのように動作するか」などの定義が記載してあり、このプログラムがメモリの上に展開(読み込まれること)されると定義どおりにデータが動作します。

プログラムが実際に動作する1つ1つの実行状態がプロセスの単位です。

「メモ帳 (notepad.exe) 」を例に説明しましょう。

メモ帳アイコン-チェシャわら

「メモ帳」は、あなたも良く使っていると思いますが、その実態は

C:\Windows\System32\notepad.exe

という実行ファイル(プログラム)なんです。

メモ帳は1度にいくつも起動することができますね。

メモ帳の多重起動-チェシャわら

図のように3つのメモ帳を起動した場合、「notepad」というプロセスが3つ実行中であるという風に考えます。

プロセスを取得する

では実際に実行中のプロセスを取得してみます。

PS C:\work> Get-Process

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
     77       4     1328       3648    35     0.00   1696   0 armsvc
    152       7     4788      12104    78     0.08   4916   1 conhost
    628       6     1680       5868   110     0.30    500   0 csrss
    553       9     2476      18132   169    11.95    552   1 csrss
    103       4     2316       5964    58     0.06   3520   1 dwm
    962      42    46660      66032   304    35.97   3544   1 explorer
     99       4     1752       5092    42     0.03   1792   0 HeciServer
      0       0        0         24     0               0   0 Idle
    789      55   114640     165868   417    74.26   5212   1 iexplore
    741      81   121480     150264   377     8.33   5748   1 iexplore
    269      11     6484      12364   163     0.30   3672   1 IMECMNT
     68       3     1272       3472    20     0.02   1744   0 IMEDICTUPDATE
     64       4     1404       3800    26     0.00   1836   0 IPROSetMonitor
    107       6     4408       8388    76     0.05   3704   1 iusb3mon
     86       5     1612       4260    27     0.00   1872   0 Jhi_service
    199       9     4060      11548    74     0.20   3760   1 jusched
    135       8     2408       5636    37     0.08   1900   0 LMS
    963      16     4708      11460    36     4.57    644   0 lsass
    216       5     2348       5280    26     0.16    660   0 lsm
     78       4     1324       4488    45     0.03   5160   1 MsSpellCheckingFacility
    478      14    45244      50184   217     0.58   5248   1 powershell
   1339      23    29900      21508   121     1.65   2816   0 SearchIndexer
    239       7     4396       7580    28     2.09    600   0 services
    524      20    12212       8440   125     5.57   2300   0 Smc
     37       1      440        960     4     0.25    372   0 smss
    387      12     5976      12664    88     0.80   1560   0 spoolsv
    242      26    11632      27020   149    13.34   3032   1 StikyNot
    387       7     3308       7748    35     1.39    768   0 svchost
    327       9     4048       7312    33     0.53    848   0 svchost
    552      13    15784      15788    72     1.39    948   0 svchost
    499      11     4764      11624    67     0.61   1004   0 svchost
    383      18     7596      15372    65     1.28   1032   0 svchost
   1101      28    14456      27152    98     2.25   1068   0 svchost
    630      18    11200      15720    90     1.28   1420   0 svchost
    322      24    11112      14440    62     0.80   1588   0 svchost
    161       9     1684       4504    25     0.23   3772   0 svchost
    773       0       48        728     3    24.82      4   0 System
    293      19    18832      17620   118     1.19   3476   1 taskhost
    352      12     4360      12060    67     0.36   2756   0 UNS
     87       5     1664       4696    43     0.14    560   0 wininit
    136       5     3008       7704    51     0.39    632   1 winlogon
    302      11     5368       5636    93     0.87   3284   0 wmpnetwk

このようにオプションを指定しない場合はマシン上で実行中のプロセス全て表示されます。

実行結果を見てみると9つのプロパティについて情報が表示されています。

それぞれのプロパティがどういった情報なのか簡単に説明します。

Handles  ⇒ プロセスがオープンしたハンドルの数

…利用しているリソースのハンドルの数を表す。

NPM(K) ⇒ プロセスが使用している非ページメモリのサイズ(KB)

…プロセスのページング(スワップアウト)不可能なメモリサイズを表す。

PM(K) ⇒ プロセスが使用しているページメモリのサイズ(KB)

…プロセスのページング可能なメモリサイズを表す。

WS(K) ⇒ プロセスのワーキングセットのサイズ(KB)

…プロセスに割り当てられたワーキングセットのメモリサイズを表す。

VM(M) ⇒ プロセスが使用している仮想メモリのサイズ(MB)

…プロセスに割り当てられた仮想メモリのサイズを表す。プロセスがメモリを使うために用意された領域の大きさを表す。

CPU(s) ⇒ プロセスが全てのプロセッサで使用したプロセッサ時間(秒)

…プロセスが開始されてから(プログラムが実行されたから)CPU上で「実行」状態になった時間の合計を表す。

Id ⇒ プロセスのプロセスID

…プロセスを識別するための番号である。0(System Idlw Process)と4(System)以外のPIDはそれぞれ異なる。

SI ⇒ プロセスのセッションID

…セッションを識別するための番号である。ユーザのログオン毎にセッションが作成されるため、どのユーザセッションで実行されているのかが判別できる。

ProcessName ⇒ プロセスのプロセス名

…プロセスを識別するためのプロセス名である。2重起動可能なプログラムもあるためプロセス名は重複する場合がある。

このようにGet-Process コマンドレットの実行結果からは

・どのプロセスが       … ProcessName,PID
・どれぐらいのメモリを使って … NPM,PM,WS,VM
・どれだけの時間動いているか … CPU

といった情報を確認することができます。

プロセス名を指定してプロセスを取得する

実行中の全てのプロセスを取得する方法は先ほど紹介しました。

次に、特定のプロセス名 (ProcessName) を指定(フィルタリング)して取得する方法についてご紹介します。

コマンドレットの詳細に記載した「パターン1(プロセス名から取得)」のオプションを使用します。

Get-Process -Name “プロセス名

では実際にプロセス名を指定してみます。

今回はわかりやすいように「メモ帳 (notepad) 」を指定します。

# メモ帳を2つ起動した状態で実行
PS C:\work> Get-Process -Name notepad

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    146       7     4776      11988    76     0.05   4184   1 notepad
    139       7     4644      12116    75     0.03   5212   1 notepad

このようにプロセス名が “notepad” だけ抽出されて表示されました。

また、プロセス名の指定にはワイルドカードが使用できます。

# ワイルドカード"*"で指定
PS C:\work> Get-Process -Name note*

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    144       7     4696      11976    76     0.05   4184   1 notepad
    140       7     4724      12136    76     0.03   5212   1 notepad

プロセス名でフィルタリングする場合の利点は「アプリケーションやソフトウェア名から何となくでも絞り込めること」だと思います。

逆に今回実践したように同じプログラムを2重起動している場合は、どっちがどっちかわからないという状態になってしまうこともあります。

プロセス ID を指定してプロセスを取得する

次に、特定のプロセス ID (Id) を指定してフィルタリングする方法についてご紹介します。

コマンドレットの詳細に記載した「パターン2(プロセス ID から取得)」のオプションを使用します。

Get-Process -Id  “プロセスID

では実際にプロセスIDを指定してみます。

先ほど2重起動したメモ帳のうちプロセス ID が「4184」の方を指定してみましょう。

# PIDの4184を指定
PS C:\work> Get-Process -Id 4184

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    137       7     4536      11984    75     0.05   4184   1 notepad

プロセス ID は実行中の全てのプロセスに一意に設定されるため「必ず1つのプロセスを指定できる」という特徴があります。

そのためプロセスを管理する(優先順位の変更・実行終了など)場合に多く用いられます。

また、先ほどとは違いワイルドカードでプロセスIDを指定することはできません。

# ワイルドカード"?"でPIDを指定
PS C:\work> Get-Process -Id (418?)
418? : 用語 '418?' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してくださ
い。
発生場所 行:1 文字:19
+ Get-Process -Id (418?)
+ ~~~~
 + CategoryInfo : ObjectNotFound: (418?:String) [], CommandNotFoundException
 + FullyQualifiedErrorId : CommandNotFoundException

プロセスオブジェクトからプロセスを取得する

プロセスオブジェクトとは「System.Diagnostics.Process」型のデータの事です。プロセス名やプロセス ID などのデータを持っています。

Get-Process コマンドレットで得られるデータそのものがプロセスオブジェクトです。

では、どんな場面でこのパターンを使えばいいのかというと、「Start-Process」コマンドレットによって起動したプロセスを監視する場合などに用いることができます。

コマンドレットの詳細に記載した「パターン3(プロセスオブジェクトから取得)」のオプションを使用します。

Get-Process -InputObject “プロセスオブジェクト

では、実際に「Start-Process」でプロセスを起動しそのプロセスを確認してみましょう。

# メモ帳を起動
$ProcObject = Start-Process notepad -PassThru

# 格納したプロセスオブジェクトを確認してみる
PS C:\work> Get-Process -InputObject $ProcObject

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    146       7     4776      11996    76     0.09   4284   1 notepad

# メモ帳を閉じた後にもう一度確認

PS C:\work> Get-Process -InputObject $ProcObject

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
              0        0          0     0     0.11   4284

このように変数に格納したプロセスオブジェクトを追うことができます。

ちなみに “-PassThru” オプションとは通常戻り値が発生しないコマンドレットに対して戻り値を返させるというものです。

まとめ

実行中のプロセスを確認する場合は

Get-Process

を使用する。

実行中のプロセスに対してフィルタリングする場合は

[プロセス名でフィルタ] Get-Process -Name <プロセス名>

[プロセスIDでフィルタ] Get-Process -Id <プロセスID>

を使用する。

コメントを残す

メールアドレスが公開されることはありません。