こんにちは。チェシャ男です。(-皿-)
今回は、
【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>を使用する。