介绍
在本次实验中,你将学习 Linux 作业管理的基础知识。作业管理是 Linux 用户必备的技能,它能让你同时运行多个进程并控制它们的执行。掌握作业管理后,你可以高效地在后台运行命令、在前台和后台任务之间切换,以及对所有正在运行的进程保持控制。
在整个实验过程中,你将学习:
- 如何在后台启动进程
- 如何查看和管理正在运行的作业
- 如何将后台作业切换到前台
- 如何暂停正在运行的作业并在稍后恢复
- 如何在作业不再需要时终止它们
当处理不需要持续交互的长时间运行任务时,这些技能特别有用,能让你在进程在后台运行的同时继续处理其他任务。
启动和管理后台作业
在这一步中,你将学习如何使用与符号 (&) 在后台启动一个进程,以及如何使用 jobs 命令来管理它。
什么是后台作业?
在 Linux 中,作业是由 shell 管理的进程。默认情况下,当你在终端中运行一个命令时,它会在前台运行 —— 这意味着在命令完成之前,你的终端会处于忙碌状态。然而,通过在命令末尾添加 & 符号,你可以将其放在后台运行,从而让你的终端可以处理其他任务。
创建一个后台进程
让我们创建一个简单的脚本,使其在后台持续运行。这将模拟一个你可能希望在继续处理其他事务时运行的长时间任务。
首先,如果你还没有进入项目目录,请导航到该目录:
cd ~/project
现在,使用 nano 文本编辑器创建一个名为 background_task.sh 的脚本:
nano ~/project/background_task.sh
在编辑器中,添加以下内容:
#!/bin/bash
## A simple script that simulates a long-running task
count=0
while true; do
count=$((count + 1))
echo "Task running: iteration $count"
sleep 5
done
这个脚本将无限期运行,每 5 秒打印一条消息。
按 Ctrl+O 然后按 Enter 保存文件,再按 Ctrl+X 退出 nano。
接下来,使脚本可执行:
chmod +x ~/project/background_task.sh
现在,通过在命令末尾添加 & 符号,在后台运行该脚本:
~/project/background_task.sh &
你应该会看到类似如下的输出:
[1] 1234
方括号中的数字 [1] 是作业编号,后面的数字是进程 ID (PID)。这些数字在你的系统上可能会有所不同。
检查正在运行的作业
要查看当前所有正在运行的后台作业,请使用 jobs 命令:
jobs
你应该会看到类似如下的输出:
[1] + running ~/project/background_task.sh
这证实了你的脚本正在后台运行。
要获取有关作业的更详细信息,包括其 PID,请使用:
jobs -l
输出应显示作业编号、PID 和状态:
[1] + 1234 running ~/project/background_task.sh
当脚本在后台继续执行时,你的终端仍然可以自由运行其他命令。脚本的输出仍然会发送到终端,因此你会定期看到消息出现。
将后台作业调至前台
在这一步中,你将学习如何使用 fg 命令将后台作业切换到前台。当你需要与当前在后台运行的进程进行交互时,这非常有用。
什么是切换到前台?
切换到前台是指将后台作业移到前台,使其成为你终端中的活动进程。当一个作业处于前台时,它将控制你的终端 —— 你可以直接与它进行交互,但在它完成或被移回后台之前,你无法运行其他命令。
使用 fg 命令
确保你在上一步中启动的 background_task.sh 脚本仍在运行。你可以使用以下命令进行验证:
jobs
你应该会看到你的脚本被列为正在运行的作业。
要将作业切换到前台,请使用 fg 命令,后面跟上带有百分号的作业编号:
fg %1
如果你只有一个后台作业,你可以简单地使用:
fg
执行该命令后,脚本将被切换到前台,你将直接在终端中看到它的输出:
Task running: iteration X
Task running: iteration X+1
...
你会注意到你的命令提示符消失了,现在脚本控制着你的终端。在你终止脚本或将其移回后台之前,你将无法再输入其他命令。
停止前台作业
要停止前台作业并返回命令提示符,请按 Ctrl+C。这会向进程发送一个中断信号,使其终止。
^C
终端现在应该会显示一条消息,表明作业已终止,并且你应该会再次看到你的命令提示符。
要验证作业是否不再运行,请运行:
jobs
应该没有输出,这表明没有后台作业正在运行。
为了下一步操作,让我们再次在后台启动我们的脚本:
~/project/background_task.sh &
你应该会看到作业已启动的确认信息,输出类似于:
[1] 1345
请记住,作业编号和 PID 在你的系统上可能会有所不同。
暂停和恢复作业
在这一步中,你将学习如何暂停一个正在运行的前台作业,并在前台或后台恢复它。当你需要暂时暂停一个进程而不终止它时,这非常有用。
暂停前台作业
首先,让我们将后台作业切换到前台:
fg %1
你现在应该能在终端中看到脚本的输出。要暂停这个前台作业,请按 Ctrl+Z:
^Z
你应该会看到类似如下的消息:
[1] + suspended ~/project/background_task.sh
这表明作业已被暂停。作业仍然加载在内存中,但它没有在执行 —— 本质上是“暂停”了。
要验证作业是否已暂停,请运行:
jobs
你应该会看到类似如下的输出:
[1] + suspended ~/project/background_task.sh
在后台恢复暂停的作业
你可以在前台或后台恢复一个暂停的作业。要在后台恢复它,请使用 bg 命令,后面跟上作业编号:
bg %1
你应该会看到一条消息,确认作业已在后台恢复:
[1] + continued ~/project/background_task.sh
验证作业现在是否正在后台运行:
jobs
输出应该显示作业状态已从“suspended”(暂停)变为“running”(运行):
[1] + running ~/project/background_task.sh
在前台恢复暂停的作业
让我们再次暂停作业。首先,将其切换到前台:
fg %1
然后按 Ctrl+Z 暂停它:
^Z
现在,不要使用 bg 在后台恢复它,而是使用 fg 在前台恢复它:
fg %1
作业将恢复执行,你将再次在终端中看到它的输出。
让我们按 Ctrl+C 停止作业:
^C
这将终止作业并让你回到命令提示符。
在工作流程中使用作业控制
暂停、在后台恢复、在前台恢复和终止作业的能力让你能够对进程进行强大的控制。这种工作流程在以下情况下特别有用:
- 当一个进程正在运行时,你需要检查其他内容
- 你需要暂时释放系统资源
- 你想在不打开多个终端窗口的情况下交互式地运行多个进程
为了下一步操作,再次启动后台任务:
~/project/background_task.sh &
终止后台作业
在这一步中,你将学习在后台作业不再需要时,使用不同的方法来终止它们。正确地终止作业对于释放系统资源和维护系统性能至关重要。
确定要终止的作业
首先,让我们检查当前正在运行的作业有哪些:
jobs
你应该会看到你的后台任务正在运行:
[1] + running ~/project/background_task.sh
如果你需要更详细的信息,包括进程 ID(PID),可以使用:
jobs -l
这将显示类似如下的输出:
[1] + 1456 running ~/project/background_task.sh
记下 PID(作业编号后面的数字),因为它可用于终止进程。
方法 1:使用作业编号终止作业
终止后台作业最直接的方法是使用 kill 命令和作业编号:
kill %1
检查作业是否已被终止:
jobs
你可能会看到:
[1] + terminated ~/project/background_task.sh
如果作业仍在运行(某些进程可能需要更强力的终止信号),你可以使用:
kill -9 %1
-9 标志会发送一个 SIGKILL 信号,该信号会强制终止进程,而不允许其进行清理操作。
方法 2:使用 PID 终止作业
让我们在后台再启动一次我们的脚本:
~/project/background_task.sh &
你应该会看到显示作业编号和 PID 的输出:
[1] 1567
要使用 PID 终止此作业,请使用:
kill 1567
将 1567 替换为你作业的实际 PID。
验证作业是否已被终止:
jobs
方法 3:使用 killall 结合进程名终止作业
让我们再启动一次我们的脚本:
~/project/background_task.sh &
如果你有多个相同进程的实例正在运行,你可以使用 killall 命令一次性终止所有这些进程:
killall background_task.sh
此命令会终止所有名为 background_task.sh 的进程。
验证是否没有作业正在运行:
jobs
应该没有输出,这表明所有后台作业都已被终止。
理解终止信号
使用 kill 命令时,你是在向进程发送一个信号。默认情况下,kill 会发送 SIGTERM 信号(信号 15),该信号会请求进程正常终止。如果进程对 SIGTERM 信号没有响应,你可以使用 SIGKILL(信号 9)来强制终止:
kill -TERM %1 ## 等同于 kill %1
kill -KILL %1 ## 等同于 kill -9 %1
其他有用的信号包括:
- SIGHUP(信号 1):通常用于重新加载配置文件
- SIGINT(信号 2):等同于按 Ctrl+C
- SIGSTOP(信号 19):暂停进程(无法被捕获或忽略)
- SIGCONT(信号 18):继续已停止的进程
为了进行最后一次演示,让我们再次启动我们的后台任务,然后终止它:
~/project/background_task.sh &
jobs
kill %1
jobs
这将启动作业,确认其正在运行,终止它,然后验证它不再运行。
总结
在这个实验中,你学习了在 Linux 环境中管理作业的重要技能:
- 启动后台作业:你学会了如何使用
&符号在后台运行进程,这样你就可以在长时间运行的任务执行时继续在终端中工作。 - 检查作业状态:你使用
jobs命令查看正在运行的作业的信息,包括它们的状态、作业编号和进程 ID。 - 将后台作业切换到前台:你练习了使用
fg命令将后台作业切换到前台,从而可以直接与它们进行交互。 - 暂停和恢复作业:你学会了如何使用
Ctrl+Z暂停正在运行的前台作业,并在前台(fg)或后台(bg)恢复它们。 - 终止作业:你探索了在作业不再需要时终止它们的不同方法,包括使用
kill命令结合作业编号或 PID,以及使用killall按名称终止多个进程。
这些作业管理技能对任何 Linux 用户都很有价值,特别是在处理长时间运行的进程或在终端环境中进行多任务处理时。通过控制进程的运行方式和时间,你可以更有效地利用系统资源并简化工作流程。
请记住,kill 命令可以使用不同的信号来控制进程的行为,从正常终止到强制终止,让你对系统进程进行精细控制。



