火辣的 PowerShell Get-Process Cmdlet 用於運行中的進程

對使用 PowerShell Get-Process cmdlet 來顯示系統中運行的進程感興趣嗎?使用 Get-Process 可以找到進程所有者、進程ID,甚至是進程在磁盤上的位置。

在這篇文章中,您將通過實際例子學習如何使用 PowerShell 的 Get-Process cmdlet。如果在Windows或Linux上操作進程聽起來像是一種樂趣,那就繼續閱讀吧!

相關: 如何使用 ps、pgrep、pkill 等在Linux中終止進程!

先決條件

在繼續之前,以下是本文示例所需的先決條件。

相關: 升級到 PowerShell 7: 一個詳細教程

  • 本文使用的是Windows 10和Ubuntu 20.04 LTS,但任何運行PowerShell的操作系統都將適用。

準備好了嗎?讓我們深入了解並管理一些進程吧!

顯示運行中的進程

Get-Process 管理本地進程。在這個第一個例子中,您正在使用 PowerShell Get-Process cmdlet。此命令顯示所有正在運行的進程。

Get-Process 返回系統正在運行的進程信息的時間點快照。要顯示實時進程信息,Windows 提供了 Windows 任務管理器,而 Linux 提供了 top 命令。

要開始,打開 PowerShell 控制台並運行 Get-Process。請注意,Get-Process 返回正在運行的進程信息,如下所示。輸出格式對於 Windows 和 Linux 操作系統是相同的。

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

默認情況下,gpsps 作為 Get-Process 的命令別名存在。由於 PowerShell 7 是跨平台的,ps 命令與 內置的 Linux 命令 衝突。因此,在 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 AdamsSystemFrontier 上的貢獻!

恭喜,您現在可以使用 Get-Process 在 Windows 和 Linux 上查看所有運行中的進程!

查找特定進程屬性

Get-Process 返回許多不同的運行中進程屬性,就像您之前看到的那樣。與所有其他 PowerShell 對象一樣,您可以有選擇地提取對象上的屬性。

現在讓我們通過一個簡單的示例來演示如何檢索特定進程的特定屬性:

  1. 啟動您的 Windows 計算器。

2. 使用打開的 PowerShell 控制台,運行 Get-Process,使用 Name 參數僅顯示名稱為 Calculator 的所有運行中進程。您將看到先前看到的相同輸出。

Get-Process -Name 'Calculator'

Get-Process 返回許多屬性,正如預期的那樣。也許您只想查找 CPU 利用率,值位於 CPU(s) 列下。請將 Get-Process 命令放在括號中,並像下面顯示的那樣引用 CPU 屬性。您將看到它僅返回 CPU 屬性的值。

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

請注意,Get-Process 返回一個名稱叫做 CPU(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。

保持 計算器 應用程序運行。您將在後面的示例中使用此應用程序。

檢索進程記憶體使用情況

解決運行緩慢的系統問題可能是一項挑戰,受限的記憶體通常是造成問題的原因之一。繼續使用 計算器 應用程式,檢索 計算器 進程,並僅顯示 VM 屬性。如下所示,顯示了使用的記憶體量,以兆字節(MB)表示。

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

為了幫助理解記憶體使用情況,請使用內建的PowerShell轉換乘數將兆位(MB)轉換為吉位(GB)。在下面的示例中,您將把記憶體使用量轉換為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中,也不是所有屬性都在預設情況下顯示。在下面繼續閱讀以了解有關PathUserName屬性的更多信息以及如何使用它們!

發現進程二進制文件所在位置

在系統上,進程可執行文件可以存儲在多個地方。如果一個進程正在運行,即使Path不會以預設方式顯示,Get-Process也可以輕鬆找到進程的文件系統路徑。如下所示,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 RemotingInvoke-Command在遠程計算機上運行它。

相關: 如何在 Windows 和 Linux 上設置 PSRemoting

但是,如果您在 Linux 上,或者在 Windows 上運行 PowerShell 6,您現在可以使用ComputerName參數查詢遠程計算機上的進程。

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

在 PowerShell 7.x 中,-ComputerName參數已被移除,因為該 cmdlet 與遠程控制無直接關係。要實現相同效果,您可以將其包裹在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 cmdlet 在本地和遠程計算機上查找正在運行的進程,包括 Linux 和 Windows。

現在,您將如何應用這些知識?嘗試將Get-Process檢索的進程傳遞到本地或遠程計算機上的Stop-Process以終止!

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