使用 ps、pgrep、pkill 等掌握 Linux 杀死进程

管理 Linux 中的进程对于新系统管理员(sysadmin)来说可能一开始看起来有些令人生畏。但通过一点解释和演示,您将学会如何查找和执行 Linux 终止进程,这只是使用命令行工具如 pskill 的问题。

在本文中,您将学到定位正在运行和错误进程、终止正在运行进程、查找后台进程等在任何 Linux 操作系统上的命令。

到本文末尾,您将像 Linux 专业人士一样通过命令行管理进程标识号(PIDs)。继续阅读,了解 Linux 中的进程管理命令的全部内容!

先决条件

本文将演示如何在 Linux 中管理进程。如果您想动手操作,您将需要以下内容:

  • A Linux host, which can be a virtual machine or a physical machine.
  • 要尝试 PowerShell 示例,请在 Linux 主机上安装 PowerShell 7.1.1
  • A non-root user account. While root access is not required, there will be an example where the root user can kill the running process of another user.

您选择使用的 Linux 发行版由您决定。本文将基于 Ubuntu 20.04 LTS。然而,这些命令对于 Linux 操作系统都是标准的。

准备好了吗?很好,让我们开始吧。

在 Linux 中管理进程

偶尔,您可能会遇到这样的情况:您需要停止 Linux 系统上正在运行的进程。例如,您可能有一个定时运行的 bash 脚本。该 bash 脚本配置为通过 cron 作业(Linux 进程调度程序)以另一个用户的身份运行。

有时,该脚本会生成错误的进程,这些进程会导致脚本执行失败。您如何在不重新启动系统或停止脚本的情况下终止这些错误的进程呢?

在接下来的部分中,您将逐步了解用于定位和终止或杀死 Linux 系统上进程的命令。每个部分都将建立在上一个部分的基础之上。您将学习关于pstoppgrepkillpkill 命令,它们都是 Linux 的本机命令。

作为奖励,如果您不喜欢 Linux 本机命令,还包括了 PowerShell 等效命令Get-ProcessStop-Process

定位进程的工具

在终止进程之前,您必须找到要目标的正确进程。唯一的 PID 允许精确定位。继续阅读,了解如何定位要终止的正确进程。

使用ps命令显示进程信息

进程状态ps命令显示与Linux系统上活动进程相关的信息。您可以使用ps找到正在运行的进程,甚至可以找到后台进程

默认情况下,ps命令将显示当前用户的有效用户标识(EUID)的所有进程。如下所示运行ps命令,将返回您的用户可以终止的每一个正在运行的进程。

ps
Displaying processes matching the EUID (effective user ID) for the user bkindle.

使用top命令查找扩展的进程信息

如果您想要找到不断刷新的关于运行进程和系统指标的信息,在这种情况下,您可以使用top命令。与ps不同,top命令会在设定的时间间隔内更新屏幕上的进程信息。

当您运行top命令时,您将看到的不仅仅是PID。包含的进程详细信息还有CPU和内存百分比,Nice值(CPU调度进程优先级),以及由Linux内核设置的进程优先级(PR)。

对于新手或有经验的系统管理员来说,top命令通常是管理重要系统资源和进程的首选工具。如下所示,top命令输出显示的进程信息比ps命令包括的整体系统指标要多。

The top command on Ubuntu Desktop 20.04 LTS showing all running PID’s.

htoptop的增强变体,包括各种改进,例如彩色终端输出。

假设您想检查进程消耗的内存或CPU资源。在这种情况下,您可以使用topp开关,如下所示。

top -p 2113
The top command displaying information on only one PID, 2113.

也许您需要显示特定用户名的所有运行中的进程。top命令提供了u开关,仅显示特定用户的进程。如下例所示,仅显示与用户IDbkindle匹配的PID。

top -u bkindle
The top command displaying only processes for the user bkindle.

使用pgrep命令定位特定进程PID

最初是Solaris命令,pgrep 被移植供Linux使用。结合了grep命令的搜索功能和ps的进程管理,pgrep在查找要定位的确切进程时提供了灵活性。

虽然ps显示更多信息,但pgrep设计为仅返回返回进程的PID。pgrep通过使用许多可用的搜索参数来定位进程。在下面的例子中,显示了pgrep搜索匹配vmtoolsd的任何进程。

pgrep vmtoolsd
Using pgrep to obtain all PIDs associated with vmtoolsd.

同样,使用 `` 开关指定用户ID以仅检索与该特定用户相关联的进程。如下所示,仅返回用户 `bkindle` 和 vmtoolsd 进程的单个PID。

pgrep -u bkindle vmtoolsd
Retrieving the specific PID for the vmtoolsd process associated with the user bkindle.

使用PowerShell的 Get-Process 在Linux中查找进程

典型的Linux命令效果很好,但您知道PowerShell也能够管理Linux进程吗?Get-Process 命令类似于Linux的 ps 命令,并返回进程信息。例如,也许您需要找到当前用户 bkindle 运行的所有进程。如下所示,找到用户 bkindle 的所有PID(由 Get-Process 标记为ID)。

Get-Process -IncludeUserName |
	Where-Object {$_.UserName -eq 'bkindle'} |
	Select-Object -Property 'Id','UserName','ProcessName'
Retrieving Linux PID’s with PowerShell’s Get-Process cmdlet.

相关: 如何使用PowerShell的Where-Object筛选所有事物

学会了如何定位不同进程,继续阅读以发现在Linux中终止或结束进程的所有方法!

使用Linux中的Kill命令终止进程

在前面的章节中,您学会了使用本机Linux和PowerShell命令定位要发送终止信号的进程的PID。接下来的章节将解释如何使用 killpkill 程序,以及其关联的信号和命令行开关。

Linux信号和进程管理

信号是Linux用来与操作系统中运行的进程通信的方法。三个主要的信号,kill命令用来终止进程是:

  • 1 (SIGHUP) – 终止交互式程序,并使守护进程(后台服务)重新读取进程使用的配置文件。
  • 9 (SIGKILL) – 强制进程退出,不执行优雅关闭任务。
  • 15 (SIGTERM) – 允许进程优雅地终止,例如在完成时关闭打开的文件。这是在使用kill命令时没有指定编号时使用的默认信号。

虽然本文只关注用于杀死进程的三个主要信号,总共有64个可用信号。使用kill -l可以获取信号及其对应编号的列表。

Great video on understanding process signals

现在你已经了解了终止进程中使用的三个主要信号,学习如何在下一节中杀死一个进程。

使用kill命令终止进程

在下一个示例中,你将使用kill命令。假设你正在运行一个名为pwsh的PowerShell实例,分配的PID是22687。以下展示了终止此进程的一种方式。

  1. 使用pgrep pwsh来确定kill命令中使用的进程pwsh的PID。
  2. 使用kill -s TERM 22687来优雅地终止pwsh进程。 TERM命令映射到15(SIGTERM)信号,并使用kill命令的s参数表示。
  3. 使用您选择的toppspgrep来验证PID是否不再列出。

下面是从Ubuntu 20.04 LTS bash终端执行上述过程的示例。

Using kill and associated commands to terminate the pwsh process.

使用killall命令可以根据名称终止所有进程,而不是PID,如果不小心使用,这个命令可能会造成严重破坏。然而,如果选择使用此命令,请使用i选项使命令要求确认。

使用pkill根据名称终止进程

您可能已经注意到kill命令仅适用于进程ID。这可能使终止进程成为一个复杂的多步骤过程。pkill 命令,包含在procps和procps-ng软件包中,根据搜索的名称终止进程。

功能上,pkill 命令充当了 pgrep 程序的包装器。 pkill 命令发送指定的信号给找到的每个进程,而不仅仅是在终端中列出 PID。 pkillkill 不同之处在于 pkill 只能使用进程的名称,而不能使用 PID。

默认情况下,在 Ubuntu 20.04 LTS 中不提供 pkill 命令。 您需要下载并安装该应用程序。 要执行此操作,请运行 sudo apt install mcollective-plugins-process -y

要使用 pkill 杀死一个进程,请执行以下步骤:

  1. 使用 ps 来验证 nano 应用程序(一个命令行文本编辑器)当前是否正在运行。 这一步是可选的,但在终止进程之前进行安全检查是一个好习惯。
  2. 使用 pkill -9 nano 强制终止 nano 应用程序。

下面是在 Ubuntu 20.04 LTS bash 终端中执行上述过程的示例。

Using the pkill command to forcefully terminate the nano process.

使用 Top 命令终止进程

当您运行 top 命令查看运行中的进程时,您可以使用 k 键终止特定的进程。 您将看到一个交互式提示,要求输入要终止的进程的 PID。

如下所示,运行 top 命令并按下 k。 输入要终止的 PID,然后按 Enter 键立即终止该 PID。

Use top to specify a process to terminate using the k keystroke.

接下来,学习一种使用 PowerShell Stop-Process 命令的本地 Linux 命令的替代方法!

使用PowerShell的Stop-Process命令终止进程

如果你不喜欢Linux原生命令,那么PowerShell可以满足你的需求!就像kill命令一样,你可以使用 Stop-Process在Linux中终止进程。再次假设你正在运行一个PowerShell的pwsh进程。

  1. 使用Get-Process -ProcessName 'pwsh'来查找PID,并记下要终止的PID。
  2. 使用Stop-Process -Id 29992,30014来终止返回的多个进程。
  3. 使用Get-Process -ProcessName 'pwsh'来验证PID,2999230014不再列出,表示它们已被终止。

你也可以使用Get-Processkill方法来终止一个或多个进程:(Get-Process -Id [PID]).Kill()(Get-Process -Id [PID1,2,3,4]).Kill()

在使用ProcessName参数时要小心。使用此参数类似于killall命令,将终止所有匹配提供的名称的进程。

以下是在Ubuntu 20.04 LTS的bash终端中执行上述过程的示例。

Using PowerShell, Stop-Process to kill processes in Linux.

下一步

你现在应该知道在Linux中查找和终止进程的许多方法了!为了你的下一个挑战,尝试使用SSH连接远程终止进程,或者终止可能在容器中运行的进程。

相关:一个在Linux世界中的Windows小伙伴:在Linux中设置SSH

Source:
https://adamtheautomator.com/linux-kill-process/