如何从 Linux 终端杀死进程

有时,强制结束一个进程可能是摆脱问题的唯一方法。 尽管“杀死”听起来很严厉,但它实际上只是意味着“强迫退出”。本文将介绍如何在 Linux 或 macOS 命令行中执行此操作。

什么是进程?

进程是指正在运行的程序。这包括像 Web 浏览器这样的应用程序,也包括与桌面环境关联的后台进程,以及 Linux 系统服务。

进程通常分为两类:

  • 前台进程:这些进程由用户直接启动,可能在终端窗口中运行,也可能是图形界面应用程序。
  • 后台进程:这些进程自动启动,不需要用户交互。它们不等待用户输入,也不会显示结果。服务和守护进程就属于后台进程。

如果将前台进程比作舞台上的演员,那么后台进程就是幕后的工作人员。

当进程出现异常或故障时,可能会占用过多的 CPU 资源、消耗大量内存,或者进入死循环,变得无响应。 例如,图形应用程序可能会停止响应鼠标点击,而终端应用程序可能永远不会返回命令提示符。

解决之道

“杀死”进程实际上是指强制结束该进程。当进程不再响应时,这是必要的解决办法。

Linux 提供了 `kill`、`pkill` 和 `killall` 命令来实现此目的。 这些命令可以用于任何类型的进程,包括图形界面或命令行、前台或后台进程。

`kill` 命令

要使用 `kill` 命令,您需要知道要终止的进程的进程 ID (PID)。可以使用 `ps` 命令查找进程的 PID。

要让 `ps` 命令显示所有进程,可以使用 `-e` (所有进程) 选项。 由于输出结果较多,建议使用 `less` 命令进行管道传输。 输入 `ps -e | less` 并按下回车键。

ps -e | less

这会显示类似于上面屏幕截图的进程列表。 您可以使用 `/` 键在 `less` 中向前搜索,或使用 `?` 键向后搜索。

要查找您感兴趣的进程,可以将 `ps` 的输出通过管道传输到 `grep` 命令,并指定进程的名称 (或名称的一部分)。

ps -e | grep shutter

找到要终止的进程的 PID 后,将其作为参数传递给 `kill` 命令。 例如,要终止上一个命令中识别的快门进程,可以使用以下命令:

kill 2099

`kill` 命令是一个沉默的刺客,如果执行成功,它不会提供任何反馈。

`pkill` 命令

`pkill` 命令允许您通过名称结束一个或多个进程,而无需知道 PID。要使用`pkill`,您需要提供一个搜索词,`pkill` 会使用这个词来匹配正在运行的进程,匹配到的进程将会被终止。因此,请确保搜索词的拼写正确。

为了安全起见,在使用 `pkill` 命令之前,可以使用 `pgrep` 命令。`pgrep` 命令也接受搜索词,并会列出与搜索词匹配的每个进程的 PID。 这个命令是安全的,因为它不会向进程发送任何终止信号。如果输入的搜索词不正确,也不会意外终止其他进程。 这可以确保在使用 `pkill` 之前仔细考虑搜索词。 `pkill` 和 `pgrep` 都以相同的方式处理搜索词。它们之间非常相似,因此它们共享同一个手册页

假设有一个进程的名称中包含“subq”。我们可以使用 `ps -u dave | grep` 命令来查看后台。可以看到“subq”会匹配该进程,且仅匹配该进程。这只是为了让您看到进程的完整名称。

ps -u dave | grep subq

假设我们的用户并不知道这些,他们只知道进程名称包含子字符串“subq”。他们使用 `pgrep` 检查搜索词是否只有一个匹配项。然后他们将该搜索词与 `pkill` 一起使用。

pgrep subq
pkill subq

可以使用 `pkill` 一次结束多个进程。 这里,用户运行 `pgrep` 来查看 Chrome 启动了多少个进程。他们使用 `pkill` 将它们全部结束。然后他们使用 `pgrep` 检查它们是否都已被删除。

pgrep chrome
pkill chrome
pgrep chrome

如果多个同名进程正在运行,但您不想全部结束它们,则可以使用 `pgrep` 的 `-f` (命令行) 选项来识别进程。一个简单的例子是两个 `ping` 进程。您只想结束其中一个,而不是全部。您可以使用它们的命令行参数来区分它们。请注意,需要使用引号将命令行参数括起来。

pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"

`killall` 命令

警告:在 Solaris 和 OpenIndiana 操作系统中,`killall` 命令会结束所有属于您的进程。 如果您是 root 用户,或使用 `sudo killall`,您将会重启计算机!在本文的研究过程中,最新版本的 OpenIndiana Hipster 2018.10 证实了这种行为。

`killall` 命令与 `pkill` 命令类似,但有一个明显的区别。您必须提供进程的完整名称,而不是搜索词。

您不能提供与进程名称的部分匹配项,必须提供完整的进程名称,如下所示:

killall shutt
killall shutter

`-y` (比 … 早) 选项允许您结束运行时间少于指定时间的进程。时间段由一个数字和单位组合而成,单位可以是:

  • `s` (秒)
  • `m` (分钟)
  • `h` (小时)
  • `d` (天)
  • `w` (周)
  • `M` (月,注意是大写“M”)
  • `y` (年)

要结束刚刚启动的名为 `ana` 的进程,并让任何更早的 `ana` 实例继续运行,如果您在两分钟内做出响应,可以在 `killall` 中使用以下参数:

killall -y 2m ana

`-o` (比 … 晚) 选项允许您终止运行时间超过指定时间的进程。此命令将结束所有运行超过一天的 `sshd` 连接:

killall -o 1d sshd

谨慎行事

这些命令可以帮助您准确、安全地识别和结束错误的进程。

请始终保持谨慎。 首先,请确保您要结束的进程确实是您想要结束的进程。 其次,请仔细检查 – 务必确认目标进程是您需要结束的进程。 确认无误后,再继续终止进程。