Linux 作业管理

LinuxLinuxBeginner
立即练习

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

简介

在本次实验中,你将学习 Linux 作业管理的基础知识。作业管理是 Linux 用户必备的技能,它能让你同时运行多个进程并控制它们的执行。掌握作业管理后,你可以高效地在后台运行命令、在前台和后台任务之间切换,以及对所有正在运行的进程保持控制。

在整个实验过程中,你将学习:

  • 如何在后台启动进程
  • 如何查看和管理正在运行的作业
  • 如何将后台作业切换到前台
  • 如何暂停正在运行的作业并在稍后恢复
  • 如何在作业不再需要时终止它们

当处理不需要持续交互的长时间运行任务时,这些技能特别有用,能让你在进程在后台运行的同时继续处理其他任务。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/ProcessManagementandControlGroup(["Process Management and Control"]) linux/ProcessManagementandControlGroup -.-> linux/jobs("Job Managing") linux/ProcessManagementandControlGroup -.-> linux/bg_running("Background Running") linux/ProcessManagementandControlGroup -.-> linux/fg("Job Foregrounding") linux/ProcessManagementandControlGroup -.-> linux/kill("Process Terminating") linux/ProcessManagementandControlGroup -.-> linux/killall("Multi-Process Killing") linux/ProcessManagementandControlGroup -.-> linux/bg_process("Background Management") subgraph Lab Skills linux/jobs -.-> lab-271311{{"Linux 作业管理"}} linux/bg_running -.-> lab-271311{{"Linux 作业管理"}} linux/fg -.-> lab-271311{{"Linux 作业管理"}} linux/kill -.-> lab-271311{{"Linux 作业管理"}} linux/killall -.-> lab-271311{{"Linux 作业管理"}} linux/bg_process -.-> lab-271311{{"Linux 作业管理"}} end

启动和管理后台作业

在这一步中,你将学习如何使用与符号 (&) 在后台启动一个进程,以及如何使用 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

这将终止作业并让你回到命令提示符。

在工作流程中使用作业控制

暂停、在后台恢复、在前台恢复和终止作业的能力让你能够对进程进行强大的控制。这种工作流程在以下情况下特别有用:

  1. 当一个进程正在运行时,你需要检查其他内容
  2. 你需要暂时释放系统资源
  3. 你想在不打开多个终端窗口的情况下交互式地运行多个进程

为了下一步操作,再次启动后台任务:

~/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 环境中管理作业的重要技能:

  1. 启动后台作业:你学会了如何使用 & 符号在后台运行进程,这样你就可以在长时间运行的任务执行时继续在终端中工作。
  2. 检查作业状态:你使用 jobs 命令查看正在运行的作业的信息,包括它们的状态、作业编号和进程 ID。
  3. 将后台作业切换到前台:你练习了使用 fg 命令将后台作业切换到前台,从而可以直接与它们进行交互。
  4. 暂停和恢复作业:你学会了如何使用 Ctrl+Z 暂停正在运行的前台作业,并在前台(fg)或后台(bg)恢复它们。
  5. 终止作业:你探索了在作业不再需要时终止它们的不同方法,包括使用 kill 命令结合作业编号或 PID,以及使用 killall 按名称终止多个进程。

这些作业管理技能对任何 Linux 用户都很有价值,特别是在处理长时间运行的进程或在终端环境中进行多任务处理时。通过控制进程的运行方式和时间,你可以更有效地利用系统资源并简化工作流程。

请记住,kill 命令可以使用不同的信号来控制进程的行为,从正常终止到强制终止,让你对系统进程进行精细控制。