実行中のプロセスのためのSteamy PowerShell Get-Process Cmdlet

システムの実行中のプロセスを表示するために PowerShell Get-Process コマンドレットを使用することに興味がありますか? Get-Process を使用すると、プロセスの所有者、プロセス ID、またはプロセスがディスク上のどこにあるかを見つけることができます。

この記事では、実際の例を通じて PowerShell の Get-Process コマンドレットの使用方法を学びます。Windows や Linux 上でプロセスを操作して自分の意に従わせることが楽しいと思えば、読み続けてください!

関連記事: ps、pgrep、pkill などを使用した Linux でのプロセスの終了方法!

前提条件

この記事の例に従うためには、以下の前提条件が必要です。

  • ほとんどの例では Windows PowerShell 5.1 が十分ですが、Linux のサポートには PowerShell 7.1 以降が必要です。

関連記事: PowerShell 7 へのアップグレード:手順

  • この記事では Windows 10 と Ubuntu 20.04 LTS を使用していますが、PowerShell が実行される任意の OS で動作します。

準備はできましたか? では、いくつかのプロセスを管理してみましょう!

実行中のプロセスの表示

Get-Processはローカルのプロセスを管理します。最初の例では、PowerShellのGet-Process コマンドレットを使用しています。このコマンドは実行中のすべてのプロセスを表示します。

Get-Processはシステムの実行中のプロセス情報の一時的なスナップショットを返します。リアルタイムのプロセス情報を表示するには、WindowsではWindowsタスクマネージャ、Linuxではtopコマンドが利用できます。

始めるには、PowerShellコンソールを開き、Get-Processを実行します。以下に示すように、Get-Processは実行中のプロセス情報を返します。出力形式はWindowsとLinuxのオペレーティングシステムで同じです。

Using the Get-Process cmdlet on Windows to display local processes.

デフォルトでは、gpsまたはpsGet-Processのコマンドエイリアスとして存在します。PowerShell 7はクロスプラットフォームであるため、psコマンドは組み込みのLinuxコマンドと競合します。したがって、psはLinuxでは動作せず、gpsエイリアスのみが使えます。

Get-Processの出力の意味はすぐには明らかではありません。デフォルトのGet-Processのプロパティは以下のように詳しく説明されています。

  • NPM(K) – プロセスが使用している非ページングメモリの量をキロバイトで表示します。(K)の注釈で示されています。
  • PM(M) – プロセスが使用しているページング可能なメモリの量をメガバイト単位で表示します。 (M) 表記によって示されます。
  • WS(M) – プロセスのワーキングセットのサイズをメガバイト単位で表示します。ワーキングセットには、プロセスが最近参照したメモリのページが含まれます。
  • VM(M) – プロセスが使用している仮想メモリの量をメガバイト単位で表示します。これには、ディスク上のページングファイルに格納されているデータも含まれます。
  • CPU(S) – プロセスがすべてのプロセスで使用したプロセッサ時間の量を秒単位で表示します。
  • Id – プロセスのプロセスID(PID)です。
  • SI – 実行中のプロセスのセッション識別子です。セッション 0 は、プロセスがすべてのユーザーに利用可能であることを示し、1 は、プロセスが最初にログインしたユーザーの下で存在することを示します。
  • ProcessName – 実行中のプロセスの名前です。

フルプロパティ名にマップされたプロパティエイリアスのリストを表示するには、Get-Process | Get-Member -MemberType 'AliasProperty' コマンドを使用します。

以下は別の素晴らしい例です。 brave プロセスの各インスタンスについて、そのプロセスのID ($_.id) を使用し、Get-NetTCPConnection に渡します。 PowerShell は、Get-NetTCPConnection を使用して、brave プロセスが開いている各ネットワーク接続に関する情報を取得します。

以下のコードをPowerShellセッションで実行してください。ただし、Braveブラウザが実行中である必要があります。

Get-Process -Name brave | ForEach-Object { Get-NetTCPConnection -OwningProcess $_.Id -ErrorAction SilentlyContinue } 

Jay Adamsさんのご協力に感謝します。 SystemFrontierでのご協力もありがとうございます!

おめでとうございます。これでWindowsとLinuxの両方で実行中のプロセスをすべて表示することができます。 Get-Processを使用してください。

特定のプロセス属性を見つける

Get-Processは、先に見たように、実行中のプロセスに関するさまざまなプロパティを返します。他のPowerShellオブジェクトと同様に、オブジェクトのプロパティを選択的に取得することができます。

具体的なプロセスの特定のプロパティを取得するシンプルな例を見てみましょう:

  1. Windowsの電卓を起動します。

2. PowerShellコンソールを開き、Nameパラメータを使用してCalculatorという名前の実行中のプロセスのみを表示するためにGet-Processを実行します。これまでに見た出力と同じものが表示されます。

Get-Process -Name 'Calculator'

Get-Processは予想どおり多くのプロパティを返します。たとえば、CPU(s)列の値でCPU使用率を見つけたい場合は、以下に示すようにGet-Processコマンドをかっこで囲み、CPUプロパティを参照します。すると、CPUプロパティの値のみが返されることがわかります。

(Get-Process -Name 'Calculator').CPU

Get-ProcessCPU(s)という名前を返しますが、上記のコードスニペットでは単にCPUという名前を使用しています。PowerShellでは、出力で実際のプロパティ名が表示されない場合があります。この概念はPS1XMLフォーマットファイルを使用して実行されます。

CPU時間は、コア全体の秒数の合計として表されます。より人間が読みやすい数値にするために、Mathメソッドを使用して小数第一位に丸めます。以下に示すように。

$cpu = (Get-Process -Name 'Calculator').CPU
[math]::Round($cpu,2)
Calculator process is using less than 1 second of CPU time across all cores.

上記の方法を使用して、Idのような他のプロパティも検索できます。プロセスのIDのみを表示したい場合に使用できます。

Calculatorアプリケーションを実行したままにしておいてください。後続の例では、このアプリケーションを使用します。

プロセスのメモリ使用量の取得

遅いシステムのトラブルシューティングは課題となることがあり、制約されたメモリが原因となることがよくあります。Calculatorアプリを使用して、Calculatorプロセスを取得し、VMプロパティのみを表示します。以下の例では、使用されているメモリがメガバイト(MB)で表示されます。

(Get-Process -Name 'Calculator').VM
Displaying the Calculator process memory usage.

メモリ使用状況を理解するために、メガバイト(MB)をギガバイト(GB)に変換するために、組み込みのPowerShell変換乗数を利用してください。以下の例では、メモリ使用量をGBに変換し、.NET数学ライブラリRoundメソッドを使用して値を丸めます。スクリーンショットに示されているように。

$ProcessMemoryGB = (Get-Process -Name 'Calculator').VM
$ProcessMemoryGB / 1GB

# .NET Math型のRoundメソッドを使用する
[Math]::Round($ProcessMemoryGB / 1GB)

組み込みのPowerShellユーティリティを使用して値を変換すると、出力を理解しやすくすることができます。プロセスのIDを見つける方法については、以下を読んでください。

Converting the calculator process memory usage to a rounded GB format.

知られていないプロパティを公開する

Get-Processでは、すべてのプロパティがデフォルトで含まれたり表示されたりするわけではありません。以下を読んで、PathおよびUserNameプロパティについての詳細と使用方法を学んでください!

プロセスのバイナリが格納されている場所を特定する

プロセスの実行可能ファイルはシステム上のさまざまな場所に格納されている場合があります。プロセスが現在実行中の場合、Get-Processを使用すると、Pathはデフォルトでは表示されませんが、プロセスのファイルシステムパスを簡単に見つけることができます。以下に示すように、Pathプロパティにはプロセス実行可能ファイルのファイルシステムの場所が含まれています。

(Get-Process -Name 'Calculator').Path
Using Get-Process to display a process’s full file system path on Windows.

Windowsと同様に、LinuxのGet-Processもファイルシステムのパスを返します。以下の例では、gnome-calculatorプロセスが実行され、コンソール出力にパスが表示されます。

(Get-Process -Name 'gnome-calculator').Path
Using Powershell Get-Process to display a process’s full file system path on Linux.

狡猾な悪意のあるアクターは、信頼できるプロセスと同じまたは類似した名前のプロセスを作成することがあります。そのため、ファイルシステムのパスを特定できる能力は、セキュリティインシデント対応(IR)シナリオに役立ちます。デフォルトの出力にはUserNameが含まれていないため、プロセスの所有者を特定する方法を知るために読み続けてください。

プロセスの所有者を見つける

出力にUserNameの値を含めるには、IncludeUserNameパラメータを使用する必要があります。特に他のユーザーのプロセスを無意識に終了しないようにするために、プロセスの所有者を知ることは重要です。以下のように、UserNameプロパティがプロセスの出力に含まれるようになります。

Get-Process -Name 'Calculator' -IncludeUserName
Displaying the owner of Calculator process on Windows.

最後に、リモートコンピュータでGet-Processを使用してプロセス情報を取得する方法について学びましょう!

リモートコンピュータでプロセスを検索する

Windows PowerShellでは、Get-Process自体にはリモート機能はありませんが、常にPowerShellリモートInvoke-Commandを活用してリモートコンピュータ上で実行できます。

関連記事: WindowsとLinuxでのPSRemotingの設定方法

しかし、Linuxを使用している場合やWindowsでPowerShell 6を実行している場合、リモートコンピュータ上のプロセスをクエリするために使用できるComputerNameパラメータがあります。

Get-Process -ComputerName 'remote_computer_name' -ProcessName 'process'

-ComputerNameパラメータはPowerShell 7.xで削除されました。このコマンドレットは直接リモート操作に関連していないためです。同じ結果を得るためには、Invoke-Commandで囲むことができます。以下のようになります:Invoke-Command -ComputerName "ComputerName" -ScriptBlock { Get-Process -ProcessName 'process' }

上記のコマンドをリモートコンピュータに対して実行すると、Get-Processコマンドがローカルで実行された場合と同じ出力が表示されます。

以下は、別のコンピュータにリモート接続し、実行中のプロセスを取得する例です:

Computer and Getting Running Processes

複数のコンピュータを指定するには、コンマで区切って指定します。例:Get-Process -ComputerName SRV1,SRV2.

次の手順

この記事では、PowerShellのGet-Processコマンドレットを使用して、ローカルおよびリモートコンピュータ(LinuxおよびWindowsの両方)で実行中のプロセスを検索する方法を学びました。

では、この知識をどのように活用しますか?Get-Processで取得したプロセスをローカルまたはリモートコンピュータに渡してStop-Processを使用して終了させてみてください!

Source:
https://adamtheautomator.com/powershell-get-process/