管理和监控 Linux 进程

CompTIACompTIABeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

引言

在本实验中,你将学习管理和监控 Linux 系统上进程的基本技能。你将探索如何与在前台和后台运行的进程进行交互,从而让你更好地控制命令行环境和系统资源。这种实践经验对于任何使用 Linux 的人来说都是基础,无论是系统管理员还是开发人员。

你将首先使用 & 操作符启动一个后台任务,并使用 jobs 查看其状态。然后,你将使用 ps 检查正在运行的进程,使用 top 监控实时系统活动,并练习使用 fgbgCtrl-Z 进行作业控制。为了完成本次实验,你将学习如何使用 renice 调整进程的优先级,并使用 kill 命令终止它,涵盖了进程管理的完整生命周期。

使用 &jobs 启动和查看后台进程

在本步骤中,你将学习如何在一个命令在后台运行,以及如何查看后台任务的状态。在 Linux shell 中,你通常会运行一个命令,然后等待它完成,之后提示符才会返回。这被称为在前台运行一个进程。然而,对于长时间运行的任务,你可能希望在后台运行它们,这样你就可以继续使用终端执行其他命令。

要在一个命令在后台运行,你只需在命令行的末尾添加一个与号 (&)。让我们用 sleep 命令来尝试一下,这是一个简单的实用程序,它会暂停指定的时长。

执行以下命令,在后台运行 sleep 300 秒。这将使我们能在接下来的步骤中对其进行操作。

sleep 300 &

按下 Enter 后,你将看到类似以下的输出,并且命令提示符会立即返回,允许你输入新命令。

[1] 12345

Shell 已经将 sleep 300 命令作为一个后台任务启动。输出提供了两个关键信息:

  • [1]: 这是 job ID。Shell 为每个后台进程分配一个唯一的 job ID。
  • 12345: 这是 Process ID (PID)。操作系统为每个正在运行的进程分配一个唯一的 PID。你的 PID 将与示例不同。

现在进程正在后台运行,你如何检查它的状态呢?你可以使用 jobs 命令,它会列出当前 shell 会话中所有在后台运行的任务。

在你的终端中运行 jobs 命令:

jobs

输出将显示我们刚刚启动的 sleep 命令,以及它的 job ID 和当前状态。

[1]+  Running                 sleep 300 &

你已成功地在后台启动了一个进程,并且知道如何检查它的状态。这是管理 Linux 系统上长时间运行任务的一项基本技能。在接下来的步骤中,我们将探索如何与这个后台任务进行交互。

使用 ps 检查正在运行的进程

在上一步中,你使用了 jobs 命令来查看当前 shell 中的后台进程。然而,jobs 命令仅限于你的会话。要更广泛地查看系统上所有正在运行的进程,你需要一个更强大的工具:ps (process status)。ps 命令在你运行时提供当前进程的快照。

让我们先运行不带任何选项的 ps 命令。此命令提供当前用户拥有的并附加到当前终端的进程的快照。

ps

输出将非常简洁,可能只显示你的 shell (zsh) 和你刚刚运行的 ps 命令。PID 在你的系统上会有所不同。

  PID TTY          TIME CMD
23882 pts/0    00:00:00 zsh
23953 pts/0    00:00:00 ps

要查看系统上所有正在运行的进程,而不仅仅是你终端中的进程,你可以使用带选项的 ps 命令。一个非常常见且有用的组合是 ps aux

  • a: 显示所有用户的进程。
  • u: 以面向用户的格式显示(显示用户、CPU%、MEM% 等)。
  • x: 包括未附加到终端的进程。

如果你要查找特定内容,长长的进程列表并没有太大用处。我们可以将 psgrep 命令结合使用来过滤输出。让我们查找你在上一步中启动的 sleep 进程。

ps aux | grep sleep

此命令过滤 ps aux 的输出,仅显示包含“sleep”一词的行。

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    23962  0.0  0.0  10788  2240 pts/0    S+   11:52   0:00 grep --color=auto sleep

你可能会在输出中看到两行。一行是你的 sleep 300 进程。另一行是你自己运行的 grep sleep 命令,它在你运行 ps 捕获进程列表的那一刻也在运行。注意 sleep 300 的 PID(在此示例中为 23885)与你首次在后台运行该命令时看到的 PID 相匹配。

另一种常用的进程查看格式是 ps -ef

  • -e: 选择系统上的每个进程。
  • -f: 显示“完整”格式的列表,其中包含有用的信息,如父进程 ID (PPID)。

让我们尝试一下,再次使用 grep 来查找我们的 sleep 进程。

ps -ef | grep sleep

输出格式不同,但提供了类似的信息。此视图特别有助于通过 PIDPPID 列查看进程层次结构。

UID        PID  PPID  C STIME TTY          TIME CMD
labex    23885 23882  0 11:50 pts/0    00:00:00 sleep 300
labex    23964 23882  0 11:53 pts/0    00:00:00 grep --color=auto sleep

你现在已经了解了如何使用 ps 来获取系统进程的快照。通过将其与 grep 等工具结合使用,你可以快速查找和检查特定进程。

使用 top 监控系统资源

在本步骤中,你将学习使用 top,这是一个用于实时系统监控的强大工具。虽然 ps 提供进程的静态快照,但 top 提供了系统活动的动态、持续更新的视图,这对于识别正在发生的资源密集型进程非常有价值。

要开始,只需在终端中输入 top 并按 Enter。

top

你的整个终端窗口将被 top 界面占据。它看起来会像这样,数据每隔几秒刷新一次。

top - 12:05:15 up 15 min,  1 user,  load average: 0.00, 0.01, 0.00
Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1987.2 total,    985.4 free,    501.8 used,    500.0 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   1325.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  167900  12936   8488 S   0.0   0.6   0:01.15 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
...

top 界面分为两个主要部分:

  • 顶部的摘要区域显示系统范围的统计信息,如正常运行时间、任务数、CPU 负载 (%Cpu(s)) 和内存使用情况 (MiB Mem)。
  • 下方的进程列表显示单个进程,默认按 CPU 使用率 (%CPU) 排序。

top 命令是交互式的。你可以使用各种按键来改变它的行为。让我们尝试几个:

  1. 按内存使用量排序: 按 M (大写 'm')。列表将根据 %MEM 列重新排序,将内存使用最多的进程排在最前面。
  2. 按 CPU 使用量排序: 按 P (大写 'p')。这将把列表按默认的 %CPU 列重新排序。
  3. 查找你的 sleep 进程: 你可以尝试找到你之前启动的 sleep 进程。它可能在列表的靠后位置,因为它没有使用任何 CPU。你可以使用 向下箭头向上箭头 键在进程列表中滚动。

当你完成观察后,可以随时退出 top

  1. 退出 top: 按 q 退出 top 界面并返回到你的命令提示符。

你现在已经学会了使用 top 来实时查看系统的进程和资源使用情况。对于任何系统管理员来说,这是排查性能问题的首选命令。

使用 fg, bg 和 Ctrl-Z 管理作业控制

在本步骤中,你将学习如何管理正在运行的作业的状态。你已经知道如何将作业放到后台运行,但如果你在前台启动了一个长时间运行的命令,然后意识到你需要收回你的终端,该怎么办?作业控制允许你在前台和后台之间移动进程,以及暂停(停止)和恢复它们。

让我们来处理你之前启动的 sleep 300 进程。首先,使用 jobs 命令检查其状态,确保它仍在运行。

jobs

你应该会看到你的 sleep 作业正在后台运行。

[1]  + running    sleep 300

现在,让我们将这个作业放到前台。要做到这一点,使用 fg (foreground) 命令,后跟以 % 为前缀的作业 ID。由于我们的作业 ID 是 1,命令是:

fg %1

shell 将显示命令名称以及额外的作业信息,并且你的命令提示符将消失。终端现在被 sleep 300 命令“占用”,等待它完成。

[1]  + 394 running    sleep 300

要收回你的终端而不终止进程,你可以将其停止。按下组合键 Ctrl-Z(按住 Ctrl 键并按下 Z)。

此操作会向进程发送一个特殊信号 (SIGTSTP),该信号会暂停其执行。进程不会被终止;它只是被挂起。你将看到一条确认此操作的消息,并且你的提示符会返回。

[1]  + 394 suspended  sleep 300

现在,再次检查你的作业状态:

jobs

输出现在显示作业的状态为“suspended”。

[1]  + suspended  sleep 300

已停止的作业可以被恢复。你可以使用 fg 在前台恢复它,或使用 bg 在后台恢复它。让我们使用 bg 命令在后台恢复它。

bg %1

shell 将确认该作业现在已在后台重新运行。

[1]  + 394 continued  sleep 300

你可以使用 jobs 最后一次验证其状态,以查看它已恢复为“Running”。你现在已成功地将一个进程从后台移到前台,停止了它,并在后台恢复了它。

使用 renice 调整进程优先级

在本步骤中,你将学习如何影响正在运行的进程的调度优先级。在 Linux 中,“nice”值决定了一个进程相对于其他进程能获得多少 CPU 时间。nice 值范围从 -20(最高优先级)到 +19(最低优先级)。默认情况下,大多数进程的 nice 值为 0。较高的 nice 值意味着进程对其他进程更“友好”,更容易让出 CPU 时间。

我们将调整你一直在使用的 sleep 进程的优先级。要做到这一点,你首先需要它的进程 ID (PID)。你可以使用 psgrep 再次找到它。

ps aux | grep sleep

查找与 sleep 300 对应的行(而不是 grep 命令本身),并记下第二列的 PID。

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    24101  0.0  0.0  10788  2240 pts/0    S+   12:15   0:00 grep --color=auto sleep

在这个例子中,PID 是 23885你必须在以下命令中使用你自己的输出中的 PID。

现在,让我们检查进程当前的 nice 值 (NI)。带 -o 选项的 ps 命令允许你指定自定义输出列。

ps -o pid,ni,cmd -p <YOUR_PID>

<YOUR_PID> 替换为你 sleep 进程的实际 PID。例如:ps -o pid,ni,cmd -p 23885

    PID  NI CMD
  23885   5 sleep 300

正如预期的那样,默认的 nice 值 (NI) 是 5。

现在,让我们使用 renice 命令更改此值。我们将 nice 值增加到 10,这将降低进程的优先级。普通用户只能增加自己进程的 nice 值(使其优先级降低)。

renice -n 10 -p <YOUR_PID>

同样,将 <YOUR_PID> 替换为你进程的 PID。该命令将报告旧的和新的优先级。

23885 (process ID) old priority 5, new priority 10

最后,通过再次运行 ps 命令来验证更改是否生效:

ps -o pid,ni,cmd -p <YOUR_PID>

输出现在应该显示新的 nice 值。

    PID  NI CMD
  23885  10 sleep 300

你已成功更改了正在运行的进程的优先级。这是一种有用的技术,可以确保长时间运行的、非关键的后台任务不会干扰更重要的前台工作。

使用 kill 终止进程

在最后这个步骤中,你将学习如何终止一个进程。虽然有些进程会自行结束,但你通常需要手动停止一个不再需要、行为异常或仅为临时目的而启动的进程,就像我们的 sleep 命令一样。为此,主要工具是 kill 命令。

kill 命令向指定的进程发送一个信号。默认情况下,它发送 SIGTERM (terminate) 信号,该信号会礼貌地请求进程关闭,允许它在退出前执行任何清理操作。

你可以使用进程 ID (PID) 或当前 shell 中后台作业的作业 ID 来定位进程。使用作业 ID 通常更方便。

首先,让我们确认我们的 sleep 作业仍在运行。

jobs

你应该会看到列出的 sleep 进程。

[1]+  Running                 sleep 300 &

现在,使用带有作业 ID (%1) 的 kill 命令来终止它。

kill %1

运行命令后,shell 可能会在终端打印一条消息,表明作业已被终止。此消息可能会立即出现,或者在你再次按下 Enter 键后出现。

[1]+  Terminated              sleep 300

让我们验证一下进程是否真的消失了。再次运行 jobs 命令。

jobs

该命令现在应该不产生任何输出,因为在此 shell 会话中没有其他活动的作业了。你也可以使用 ps 来仔细检查。

ps aux | grep sleep

你可能看到的唯一一行是 grep sleep 命令本身。原始的 sleep 300 进程已不再运行。

在进程无响应且不响应默认 SIGTERM 信号的情况下,你可以发送一个更强制的信号,SIGKILL (信号编号 9),它会立即终止进程,而不给它清理的机会。命令将是 kill -9 %1。这应该作为最后的手段使用。

恭喜!你现在已经练习了 Linux 中基本进程管理的完整生命周期:在后台启动进程,使用 pstop 进行检查,使用作业控制进行管理,调整其优先级,最后,终止它。

总结

在本实验中,你学习了在 Linux 环境下管理和监控进程的基本技能。你首先使用 & 运算符在后台运行一个进程,并使用 jobs 命令查看其状态。然后,你探索了如何使用 ps 检查所有正在运行的进程以查找进程 ID (PID) 等详细信息,以及如何使用 top 进行系统资源使用情况和活动进程的实时监控。

此外,你还通过使用 Ctrl-Z 挂起一个前台进程,使用 bg 将其移到后台,以及使用 fg 将其带回前台来练习了作业控制。你还学会了如何使用 renice 调整进程的调度优先级,以及如何使用 kill 命令及其 PID 来优雅地终止一个进程。