如何在 Linux 中终止进程

Linux 进程管理详解 (2024版)

大家或多或少都遇到过这样的情况:电脑运行速度出奇地慢,即使执行一些基础操作也异常卡顿。在 Windows 系统中,你只能依靠任务管理器来查看并结束那些不重要的、却占用大量内存的进程。而在 Linux 系统中,你则拥有更为丰富的命令和图形界面工具来管理这些任务。本文将介绍一些简单的命令行 (CLI) 操作,以及图形用户界面 (GUI) 方法,帮助你了解如何在 Linux 系统中优雅地结束进程。

什么是 Linux 进程?

在 Linux 中,每一个正在运行的程序实例都被称为“进程”,而每个可执行文件则被称为程序。当执行一个程序时,就会创建一个进程,每个进程会被分配一个唯一的5位标识号,即“进程 ID”。当一个进程执行完毕或被强制终止时,其进程 ID 会被分配给下一个新启动的进程。

通过命令行终止 Linux 进程

虽然与使用 GUI 工具相比,终端操作有时让人感觉有点畏惧,但一旦你熟悉了命令及其各种选项,管理进程会变得非常高效且便捷。

终止信号

当你尝试从 Linux 的 GUI 或 CLI 终止进程时,操作系统内核会向该进程发送一个终止信号。该进程会根据接收到的信号做出相应的反应。每个信号都被分配了一个特定的数字,以便程序能够快速识别。尽管存在多种终止信号,这里我们仅解释一些最常用的:

信号 数值 说明
SIGHUP 1 代表 ‘Signal Hangup’,当终端关闭时发送。
SIGINT 2 代表 ‘Signal Interrupt’,当用户终止进程时发送。
SIGKILL 9 代表 ‘Signal Kill’,当你需要立即强制退出进程时发送。
SIGTERM 15 代表 ‘Signal Terminate’,当你需要终止进程并释放资源时发送。
SIGSTOP 19 (ARM, x86) 或 17 (Alpha) 或 23 (MIPS) 或 24 (PA-RISCI) 代表 ‘Signal Stop’,当你需要暂停进程并稍后恢复时发送。

最常用的信号是 SIGKILL (9) 和 SIGTERM (15)。

识别进程 ID

在终止一个进程之前,你需要知道一些进程的详细信息,如进程 ID、运行时间等。要查看进程的详细信息,可以使用 ps 命令:

ps

使用 ps 命令,你可能需要滚动并仔细查看进程名称,这可能很麻烦。 更好的方法是结合使用 psgrep 命令,如下所示:

ps | grep <进程名>

为了更简洁,还有一个单独的命令可以只显示你需要的运行中进程的进程 ID。使用 pidof 命令的语法是:

pidof <进程名称>

使用 kill 命令终止进程

一旦你获得了要终止的进程的 ID,在 Linux 系统上终止进程最常用的命令就是 kill 命令。 使用 kill 命令的语法是:

kill <signal> <process_id>

<signal> 参数是可选的, kill 命令默认发送 SIGTERM (15) 信号。你可以通过其数值或上表中的实际信号名称来指定其他信号。

使用 pkill 命令终止进程

如果你觉得查找进程 ID 不方便,可以使用 pkill 命令。它通过匹配模式查找进程,然后将其终止。使用 pkill 命令的语法是:

pkill <选项> <模式>

pkill 命令常用的选项包括:

选项 描述
-n 只选择与进程 ID 匹配的最新进程。
-u 选择特定用户拥有的进程。
-x 选择与模式完全匹配的进程。

这在多个用户在同一系统上处理同一程序的不同实例,并且其中一个实例出现异常时尤其重要。例如,在下面的截图中,我们使用 pkill 命令杀死了用户 “intel” 拥有的 “gedit” 实例:

pkill -u intel gedit

使用 killall 命令终止进程

killall 命令的工作方式类似于 kill 命令,但它会杀死与进程名称匹配的所有进程,而无需考虑用户。默认情况下,如果没有指定其他信号,它会发送 SIGTERM 信号。值得注意的是,killall 命令永远不会杀死自己,但可以终止其他 killall 命令的实例。使用 killall 命令的语法是:

killall <选项> <进程名称>

killall 命令常用选项:

选项 描述
-r process_name 解释为正则表达式模式,并终止匹配该模式的进程。
-u 杀死指定所有者拥有的进程。
-o 杀死比特定时间更早启动的进程。
-y 杀死比特定时间更晚启动的进程。

killall 命令可以用于终止一系列相同的进程,甚至终止特定所有者拥有的所有进程。 例如,我们使用 killall 命令杀死了所有名为 “sleep 500” 的进程:

killall -v sleep

使用 top/ htop 命令终止 Linux 进程

当你不知道哪些进程正在消耗最多的系统资源时,这些工具非常有用。 通过 tophtop 命令,你可以浏览所有正在运行的进程,甚至包括僵尸进程,并可以快速结束它们。 要使用 top 命令监控资源,请在终端中使用以下命令:

top

解读 top 命令输出:

top 命令的主要输出分为以下几列:

  • PID:显示正在运行的进程的进程 ID。
  • USER:显示进程的所有者。
  • PR:显示操作系统分配给进程的优先级值。
  • NI:显示 nice 值,用于手动调整进程的优先级。
  • VIRT:显示进程使用的虚拟内存量。
  • RES:显示进程使用的物理内存量。
  • SHR:显示进程与其他进程共享的内存量。
  • S:显示进程的当前状态,可以是:
    • D:不可中断的睡眠。
    • R:运行中。
    • S:睡眠中。
    • T:停止。
    • Z:僵尸进程。
  • %CPU:以百分比显示进程使用的 CPU 量。
  • %MEM:以百分比显示进程使用的 RAM 量。
  • TIME+:显示进程的总运行时间。
  • COMMAND:显示为进程调用的命令。

如果你不知道要终止的任务的进程 ID,可以使用箭头键浏览列表,或者搜索进程名称。要搜索进程名称,请按键盘上的 “L” 并输入进程名称。找到目标进程后,按 “k” 键终止该进程。接着,输入进程 ID 或保持当前选中的进程,然后按 “ENTER”。最后,输入终止信号,然后按 “ENTER” 键终止程序。要返回终端,按 “q” 键即可。

尽管 top 命令提供了所有正在运行的进程的详细信息,但对于初学者来说可能不太友好,因为它没有显示任何快捷键或者使用提示。另一方面,htop 命令提供了更加用户友好的界面,即使对于命令行工具而言。此外,它在单独的视图中显示所有信息,使得终端窗口更加清晰。大多数 Linux 发行版没有预装 htop,你需要使用以下命令安装:

sudo apt install -y htop

要在 Linux 中使用 htop 管理进程,请使用以下命令:

htop

要终止程序,请导航到目标进程,按 “F9″,然后按 Enter 键。如果要搜索并终止任何程序,请按 “F3″,输入名称,然后按 Enter 键。进程名称会高亮显示,按 “F9″,然后按 Enter 键即可终止进程。

在 Linux 中通过系统监视器终止进程

如果你觉得命令行方法有点难度,可以使用每个 Linux 发行版都提供的内置系统监控工具。要了解它是如何工作的,请从 “应用程序” 菜单中打开系统监视器工具,然后按照以下步骤操作。

1. 系统监视器打开后,你将在顶部看到三个标签,分别是 “进程”、”资源” 和 “文件系统”。要管理进程,请转到 “进程” 标签。在这里,你会看到所有当前正在运行的进程。按下 “CTRL+F” 搜索进程名称。单击要终止的进程名称,然后单击 “结束进程”。

2. 接着,你会收到是否要结束进程的确认提示。继续点击红色的大 “结束进程” 按钮来终止 Linux 中的进程。

常见问题

如何停止 Linux 中的所有进程?

如果你需要为 Linux 中的特定用户停止所有进程(登录 shell、init 和内核特定进程除外),请使用 pkillkillall 命令,格式如下:

pkill -u <用户名>

killall -u <用户名>

如果需要终止包括 init 系统在内的所有用户的进程,请按键盘上的 “ALT + Prt Sc + o” 键。

结束一个进程是否安全?

当你关闭一些不必要的后台进程或占用大量系统内存的用户进程时,你释放了资源,以便其他进程使用。但是,在结束任何进程之前,请确保你没有终止必要的操作系统进程。

Linux 中的后台进程是什么?

在 Linux 中,后台进程是指可以在没有 shell 实例或用户干预的情况下运行的进程。可以使用 tophtopps 等命令查看它们。

什么是僵尸进程?

一个已经被用户杀死,但仍然占用内存的进程被称为僵尸进程。

CTRL + Z 在 Linux 中有什么作用?

当你在 Linux 中使用 CTRL + Z 时,它会发送 SIGTSTP 信号,该信号会暂停进程并将其置于后台。 当一个进程在后台处于暂停状态时,你不能直接终止它,除非将它调回前台。

轻松管理 Linux 进程

学习如何终止占用资源的进程对于每个用户来说都是非常重要的技能。 本文介绍了命令行方法,包括 kill, killallpkill 等命令,以及在 Linux 中终止进程的 GUI 方法。我们还详细说明了如何使用 tophtop 等工具来管理 Linux 电脑上的进程。如果你在使用这些工具终止进程时遇到任何问题,请在下方评论区告诉我们。