Windows OSやクロスプラットフォーム環境の運用管理において、システム上で動作しているプロセスを正確に把握することは非常に重要です。
Windows PowerShellおよび最新のPowerShell 7系で標準的に提供されているGet-Processコマンドレットは、システムの状態を可視化するための強力なツールとなります。
単にプロセスの一覧を表示するだけでなく、特定の条件で絞り込んだり、メモリ使用率が高い順に並べ替えたりすることで、トラブルシューティングや自動化に役立てることができます。
本記事では、Get-Processの基本的な使い方から、実務で使える応用的なフィルタリング手法までを詳しく解説します。
Get-Processコマンドレットの基本操作
Get-Processは、ローカルまたはリモートコンピューター上のプロセス情報を取得するためのコマンドレットです。
引数を指定せずに実行すると、現在実行中のすべてのプロセスが一覧として表示されます。
まずは、最も標準的な実行方法とその出力結果を確認してみましょう。
# すべてのプロセスを表示する
Get-Process
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
542 32 45120 62440 1.25 4312 1 chrome
124 8 2140 6512 0.03 1284 0 idle
1821 95 154210 184200 45.62 2512 1 powershell
...
表示される各項目には、システムのパフォーマンスを理解するための重要な指標が含まれています。
Handles(ハンドル数)は、プロセスが開いているファイルやレジストリキーなどのリソース数を示します。
PM(K)(プライベートメモリ)は、そのプロセスが専用で使用しているメモリ量(KB単位)を表します。
WS(K)(ワーキングセット)は、プロセスが物理メモリ上で実際に使用しているメモリ量を示します。
CPU(s)は、プロセスが起動してから使用した合計プロセッサ時間(秒)です。
これらの数値を正しく読み取ることで、システムの負荷状況を即座に判断できるようになります。
特定のプロセスを指定して取得する
特定のアプリケーションだけを調査したい場合は、-Nameパラメータを使用してプロセス名を指定します。
プロセス名には、拡張子(.exe)を含める必要はありません。
# 特定のプロセス名(例:powershell)のみを取得
Get-Process -Name powershell
また、プロセスID(PID)が既に判明している場合は、-Idパラメータを使用するのが最も確実な方法です。
# プロセスIDを指定して取得
Get-Process -Id 2512
ワイルドカード(*)を利用して、複数のプロセスをまとめて取得することも可能です。
たとえば、「ms」から始まるすべてのプロセスを抽出するといった操作が簡単に行えます。
# 「ms」で始まるプロセスをすべて表示
Get-Process -Name ms*
出力情報の整理と選択的な表示
デフォルトの表示項目では不足している場合や、逆に情報が多すぎて見にくい場合があります。
Select-Objectコマンドレットをパイプラインでつなぐことで、必要なプロパティだけを抽出できます。
主要なプロパティの抽出
プロセスの名前、ID、開始時刻、およびファイルパスを取得する例を見てみましょう。
# 特定の列のみを抽出して表示
Get-Process | Select-Object -Property ProcessName, Id, StartTime, Path
このように実行することで、デフォルトでは表示されない「StartTime(開始時刻)」や「Path(実行ファイルの場所)」を確認できます。
特に、不審なプロセスがどこから実行されているかを調査するセキュリティチェックにおいて、Pathプロパティは非常に有用です。
メモリ使用量をわかりやすい単位に変換する
デフォルトのメモリ表示はKB(キロバイト)単位ですが、現代のシステムではMB(メガバイト)やGB(ギガバイト)単位の方が直感的です。
PowerShellの計算機能(計算済みプロパティ)を利用して、単位を変換してみましょう。
# メモリ使用量をMB単位に変換して表示
Get-Process | Select-Object ProcessName,
@{Name="Memory(MB)"; Expression={$_.WorkingSet / 1MB}} |
Sort-Object "Memory(MB)" -Descending
上記のコードでは、WorkingSetの値を1MBで割り、小数点を含めた見やすい形式で出力しています。
運用監視のレポートを作成する際には、このような単位変換が必須となります。
実用的なフィルタリングとソート手法
大量のプロセスの中から、問題のあるプロセスを特定するにはフィルタリング技術が欠かせません。
Where-Objectコマンドレットを使用することで、複雑な条件指定が可能になります。
CPU使用率やメモリ使用量で絞り込む
たとえば、CPU使用時間が一定時間を超えている負荷の高いプロセスのみを抽出する場合、以下のように記述します。
# CPU使用時間が100秒を超えているプロセスを抽出
Get-Process | Where-Object { $_.CPU -gt 100 }
また、メモリ(ワーキングセット)を500MB以上消費しているプロセスを特定するコードは以下の通りです。
# 500MB以上のメモリを消費しているプロセスを探す
Get-Process | Where-Object { $_.WorkingSet -gt 500MB }
「-gt」は比較演算子で「Greater Than(~より大きい)」を意味します。
動作が停止している、あるいは応答のないプロセスを確認する
GUIアプリケーションがフリーズしているかどうかを判定するには、Respondingプロパティを確認します。
# 応答のない(フリーズした)プロセスを特定する
Get-Process | Where-Object { $_.Responding -eq $false }
このコマンドの結果にプロセスが含まれる場合、そのアプリケーションはユーザー操作を受け付けない状態になっている可能性があります。
プロセスの管理と自動化への応用
情報の取得ができたら、次はそれらのプロセスを制御する方法を学びましょう。
Stop-Processコマンドレットを組み合わせることで、特定の条件に合致したプロセスを自動的に終了させることができます。
条件に一致するプロセスを一括終了する
たとえば、特定の名前を持つプロセスが複数立ち上がっており、それらを一括で終了させたい場合は以下のように記述します。
# 特定の名前(例:notepad)のプロセスをすべて終了させる
Get-Process -Name notepad | Stop-Process -Force
-Forceパラメータを付加することで、確認ダイアログを表示せずに強制終了を実行します。
システムに必要なプロセスを誤って終了させないよう、フィルタリング条件は慎重に指定してください。
CSVやHTML形式でのエクスポート
定期的なシステム診断の結果を残すために、取得したプロセス一覧をファイルへ保存することが推奨されます。
# プロセス一覧をCSVファイルとして出力
Get-Process | Select-Object ProcessName, Id, CPU, WorkingSet |
Export-Csv -Path "C:\Logs\ProcessList.csv" -NoTypeInformation -Encoding utf8
CSV形式であればExcelで容易に開くことができ、時系列での比較分析も容易になります。
また、HTML形式で出力してWebブラウザで確認可能なレポートを作成することも可能です。
# プロセス一覧をHTMLレポートとして出力
Get-Process | ConvertTo-Html | Out-File "C:\Logs\ProcessReport.html"
高度なTips:特定のユーザーのプロセスのみを表示する
マルチユーザー環境のサーバーでは、自分以外のユーザーが実行しているプロセスを切り分けたい場面があります。
PowerShell 7以降(あるいは管理者権限での実行)では、-IncludeUserNameパラメータを使用して実行ユーザー情報を取得できます。
# 各プロセスの実行ユーザーを表示(管理者権限が必要)
Get-Process -IncludeUserName | Select-Object ProcessName, Id, UserName
この機能を利用すれば、特定のユーザーが過剰にリソースを消費していないかを監視することができます。
特定のドメインユーザーに絞り込んでフィルタリングを行う例を以下に示します。
# 特定のユーザー「Admin01」のプロセスのみを抽出
Get-Process -IncludeUserName | Where-Object { $_.UserName -like "*Admin01" }
Get-Process使用時のパフォーマンス上の注意点
非常に多くのプロセスが動作している大規模なサーバー環境では、Get-Processを頻繁に実行すると、それ自体が負荷になる可能性があります。
特に-IncludeUserNameやネットワーク越しのリモート取得を行う際は、処理時間が長くなる傾向があります。
リアルタイム監視を行いたい場合は、Get-Processをループさせるのではなく、Get-Counterなどのパフォーマンスカウンタを検討するのも一つの手です。
しかし、一回限りの状態把握や、スクリプトによる定期的なログ収集においては、Get-Processの柔軟性は他に代えがたいメリットとなります。
まとめ
PowerShellのGet-Processコマンドレットは、プロセスの把握からフィルタリング、さらには停止といった制御までを網羅する非常に強力なツールです。
基本的なプロセス名の指定だけでなく、Select-ObjectやWhere-Objectを組み合わせることで、必要な情報を自由自在に抽出できることがお分かりいただけたかと思います。
特にメモリ使用量の単位変換や、応答停止プロセスの特定は、日々のシステム管理業務ですぐに役立つテクニックです。
まずは自分のPCでコマンドを実行し、どのような情報が取得できるのかを試してみることから始めてみてください。
これらのスキルを習得することで、Windows環境におけるトラブルシューティングのスピードは飛躍的に向上します。
今後もPowerShellを活用し、効率的なシステム運用管理を目指していきましょう。
