介绍
在本实验中,你将学习在 Linux 系统上管理和监控进程的核心技能。你将探索如何与运行在前台和后台的进程进行交互,从而让你对命令行环境和系统资源拥有更强的控制力。无论对于系统管理员还是开发人员,这种实战经验都是在 Linux 环境下工作的基础。
你将从使用 & 运算符启动后台作业并使用 jobs 查看其状态开始。接着,你将使用 ps 检查运行中的进程,使用 top 监控实时系统活动,并练习使用 fg、bg 和 Ctrl-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:包括未关联到终端的进程。
如果你在寻找特定的内容,那么长长的进程列表就没那么好用了。我们可以将 ps 与 grep 命令结合使用来过滤输出。让我们找到你在上一步中启动的 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
输出格式不同,但提供了类似的信息。这种视图对于通过 PID 和 PPID 列查看进程层级结构特别有用。
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列重新排序,在顶部显示最耗内存的进程。 - 按 CPU 使用率排序:按下
P(大写 'p')。这将使列表恢复到默认状态,按%CPU列排序。 - 查找你的
sleep进程:你可以尝试在列表中寻找你之前启动的sleep进程。它可能在列表的很下面,因为它不占用任何 CPU。你可以使用下箭头和上箭头键滚动进程列表。
观察结束后,你可以随时退出 top。
- **退出
top**:按下q退出top界面并返回命令提示符。
你现在已经使用 top 获取了系统进程和资源使用情况的实时视图。这是任何系统管理员排查性能问题时的首选命令。
使用 fg、bg 和 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)。你可以再次使用 ps 和 grep 找到它。
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 中基础进程管理的完整生命周期:在后台启动进程、使用 ps 和 top 检查进程、使用作业控制管理进程、调整其优先级,以及最后终止进程。
总结
在本实验中,你学习了在 Linux 环境中管理和监控进程的基本技能。你首先学习了使用 & 运算符在后台运行进程,并使用 jobs 命令查看其状态。接着,你探索了如何使用 ps 检查所有运行中的进程以查找进程 ID(PID)等详细信息,以及如何使用 top 实时监控系统资源使用情况和活动进程。
此外,你还通过使用 Ctrl-Z 挂起前台进程、使用 bg 将其移至后台以及使用 fg 将其调回前台来练习了作业控制。你还学习了如何使用 renice 调整进程的调度优先级,以及如何使用带有 PID 的 kill 命令优雅地终止进程。



