管理和监控 Linux 进程

LinuxBeginner
立即练习

介绍

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

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

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

在这一步中,你将学习如何在后台运行命令以及如何查看后台作业的状态。在 Linux Shell 中,通常你运行一个命令后必须等待其完成,提示符才会返回。这被称为在前台运行进程。然而,对于耗时较长的任务,你可能希望它们在后台运行,以便继续在终端中输入其他命令。

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

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

sleep 300 &

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

[1] 12345

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

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

既然进程已经在后台运行,如何检查其状态呢?你可以使用 jobs 命令,它会列出当前 Shell 会话后台运行的所有作业。

在终端中运行 jobs 命令:

jobs

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

[1]+  Running                 sleep 300 &

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

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

在这一步中,你将使用 ps 命令来检查正在运行的进程。在上一步中,你使用 jobs 命令查看了当前 Shell 中的后台进程。但是,jobs 仅限于当前的会话。而 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%、内存% 等)。
  • 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)与你首次在后台运行该命令时看到的一致。

另一种查看进程的常用格式是 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 命令是交互式的。你可以使用各种按键来改变它的行为。让我们尝试几个:

M(大写的 'm')按内存使用量排序。列表将根据 %MEM 列重新排序,将占用内存最多的进程显示在顶部。

P(大写的 'p')按 CPU 使用率排序。这将把列表恢复为默认的按 %CPU 列排序。

尝试找到你之前启动的 sleep 进程。它可能在列表的下方,因为它没有使用任何 CPU。你可以使用键盘的向下箭头向上箭头键在进程列表中滚动。

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

q 退出 top 界面并返回到命令行提示符。

你现在已经使用 top 获取了系统进程和资源使用情况的实时视图。这是任何系统管理员排查性能问题的首选命令。

使用 fgbg 和 Ctrl-Z 进行作业控制

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

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

jobs

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

[1]  + running    sleep 300

现在,将该作业带到前台。为此,请使用 fg(前台)命令,后面跟一个带有 % 前缀的作业 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   0 sleep 300

不出所料,默认的 nice 值(NI)为 0。

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

renice -n 10 -p <YOUR_PID>

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

23885 (process ID) old priority 0, 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)或当前 Shell 中的后台作业的作业 ID 来定位进程。使用作业 ID 通常更方便。

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

jobs

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

[1]+  Running                 sleep 300 &

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

kill %1

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

[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 调整进程的调度优先级,以及如何通过其 PID 使用 kill 命令优雅地终止进程。