热情的 PowerShell Get-Process 命令用于运行进程

感兴趣使用 PowerShell Get-Process 命令来显示系统的运行进程吗?使用 Get-Process,您可以找到进程所有者、进程 ID,甚至是进程所在磁盘的位置。

在本文中,您将通过实际示例学习如何使用 PowerShell 的 Get-Process 命令。如果对在 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 命令 冲突。因此 ps 在 Linux 上无法使用,只能使用 gps 别名。

Get-Process 输出的含义可能不是立即明显的。下面更详细地描述了默认的 Get-Process 属性。

  • NPM(K) – 进程正在使用的非分页内存量,以千字节显示,由 (K) 表示。
  • 进程内存使用量(M) – 以兆字节显示的进程正在使用的可分页内存量,由(M)标记表示。
  • 工作集大小(M) – 以兆字节显示的进程的工作集大小。工作集包括进程最近引用的内存页面。
  • 虚拟内存(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进程打开的每个网络连接的信息。

运行以下代码,当 Brave 浏览器 正在运行时在您的 PowerShell 会话中执行。

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 控制台,使用 Name 参数运行 Get-Process,以仅显示名称为 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。

计算器应用程序保持运行状态。您将在接下来的示例中使用此应用程序。

检索进程内存使用情况

解决运行缓慢的系统可能是一项挑战,内存受限往往是其中一个原因。继续使用计算器应用程序,检索Calculator进程,并仅显示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属性以及如何使用它们的更多信息!

发现进程二进制文件所在位置

系统中有许多位置可以存储进程可执行文件。如果进程当前正在运行,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中被移除,因为该cmdlet与远程操作不直接相关。为了达到相同的效果,你可以将其包装在Invoke-Command中,就像这样:Invoke-Command -ComputerName "计算机名称" -ScriptBlock { Get-Process -ProcessName '进程' }

当上述命令针对远程计算机运行时,与在本地运行Get-Process命令时显示相同的输出。

以下是远程连接到另一台计算机并获取正在运行的进程的示例:

Computer and Getting Running Processes

你可以通过用逗号分隔它们来定位多台计算机,例如:Get-Process -ComputerName SRV1,SRV2.

下一步

在本文中,你已经学会了如何使用PowerShell Get-Process cmdlet在本地和远程计算机上使用PowerShell查找运行中的进程,无论是在Linux还是Windows上。

现在,你将如何运用这些知识呢?尝试将Get-Process检索到的进程传递给Stop-Process,以终止本地或远程计算机上的进程!

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