管理与监控 Linux 进程

CompTIABeginner
立即练习

介绍

在本实验中,你将学习在 Linux 系统上管理和监控进程的核心技能。你将探索如何与运行在前台和后台的进程进行交互,从而让你对命令行环境和系统资源拥有更强的控制力。无论对于系统管理员还是开发人员,这种实战经验都是在 Linux 环境下工作的基础。

你将从使用 & 运算符启动后台作业并使用 jobs 查看其状态开始。接着,你将使用 ps 检查运行中的进程,使用 top 监控实时系统活动,并练习使用 fgbgCtrl-Z 进行作业控制。在实验最后,你将学习如何使用 renice 调整进程优先级,并使用 kill 命令终止进程,从而涵盖进程管理的完整生命周期。

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

在这一步中,你将学习如何在后台运行命令以及如何查看后台作业的状态。在 Linux 终端(Shell)中,你通常运行一个命令并等待它完成后,提示符才会再次出现。这被称为在「前台」运行进程。然而,对于耗时较长的任务,你可能希望在「后台」运行它们,以便可以继续使用终端执行其他命令。

要在后台运行命令,只需在命令行末尾添加一个和路符号(&)。让我们尝试使用 sleep 命令,这是一个简单的工具,用于暂停指定的时间。

执行以下命令,在后台运行 sleep 300 秒。这将允许我们在后续步骤中对其进行操作。

sleep 300 &

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

[1] 12345

终端已将 sleep 300 命令作为后台作业启动。输出提供了两个关键信息:

  • [1]:这是作业 ID(Job ID)。终端会为每个后台进程分配一个唯一的作业 ID。
  • 12345:这是进程 ID(PID)。操作系统会为每个运行中的进程分配一个唯一的 PID。你看到的 PID 会与示例不同。

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

在终端中运行 jobs 命令:

jobs

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

[1]+  Running                 sleep 300 &

你已经成功在后台启动了一个进程,并学会了如何检查其状态。这是在 Linux 系统上管理长时任务的基本技能。在接下来的步骤中,我们将探索如何与这个后台作业进行交互。

使用 ps 检查运行中的进程

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

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

ps

输出会非常简略,可能只显示你的终端(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 占用率、内存占用率等)。
  • 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 并按回车键。

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 获取了系统进程和资源使用情况的实时视图。这是任何系统管理员排查性能问题时的首选命令。

使用 fgbg 和 Ctrl-Z 管理作业控制

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

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

jobs

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

[1]  + running    sleep 300

现在,让我们将此作业调至前台。为此,请使用 fg(foreground)命令,后跟以 % 为前缀的作业 ID。由于我们的作业 ID 是 1,因此命令为:

fg %1

终端将显示命令名称以及额外的作业信息,并且你的命令提示符会消失。终端现在被 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

终端将确认该作业现在再次在后台运行。

[1]  + 394 continued  sleep 300

你可以最后一次使用 jobs 验证其状态,看到它已变回「Running」。你现在已成功地将进程从后台移至前台、停止它,并在后台恢复了它。

使用 renice 调整进程优先级

在这一步中,你将学习如何影响运行中进程的调度优先级。在 Linux 中,进程的「谦让度」(Niceness)决定了它相对于其他进程能获得多少 CPU 时间。Nice 值的范围从 -20(最高优先级)到 +19(最低优先级)。默认情况下,大多数进程启动时的 Nice 值为 0。Nice 值越高,意味着该进程对其他进程越「谦让」(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(终止)信号,这会礼貌地要求进程关闭,允许其在退出前执行任何清理操作。

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

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

jobs

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

[1]+  Running                 sleep 300 &

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

kill %1

运行命令后,终端可能会打印一条消息,指示作业已被终止。这条消息可能会立即出现,也可能在你再次按下回车键后出现。

[1]+  Terminated              sleep 300

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

jobs

该命令现在应该没有任何输出,因为此终端会话中不再有活动作业。你也可以使用 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 调整进程的调度优先级,以及如何使用带有 PID 的 kill 命令优雅地终止进程。