Linux 后台管理

LinuxLinuxBeginner
立即练习

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

简介

Linux 具备强大的能力,可以同时管理多个进程。其关键特性之一是能够在后台运行进程,这使你在长时间运行的进程执行时,仍可继续使用终端进行其他任务。

在这个实验中,你将学习在 Linux 系统中管理后台进程的重要技巧。这些技能对于在命令行环境中进行高效的多任务处理至关重要,并且系统管理员和开发人员经常会用到。

在本实验结束时,你将了解如何启动后台进程、监控它们的状态并有效地控制它们。这些技能将帮助你更好地利用系统资源,并在使用 Linux 系统时提高你的工作效率。

在后台启动进程

在 Linux 中,你可以通过在命令末尾添加一个与符号 (&) 来让命令在后台运行。这会告知 shell 在后台运行该进程,从而让你在命令执行时继续使用终端。

让我们创建并运行一个模拟长时间运行进程的简单脚本。

首先,确保你位于项目目录中:

cd ~/project

现在,使用 nano 文本编辑器创建一个名为 long_running.sh 的脚本文件:

nano ~/project/long_running.sh

当 nano 编辑器打开后,输入以下代码:

#!/bin/bash
echo "Starting a long process..."
sleep 15
echo "Process completed"

这个脚本:

  1. 打印一条启动消息
  2. 暂停 15 秒(模拟耗时任务)
  3. 打印一条完成消息

要在 nano 中保存文件:

  1. Ctrl + O 写入文件
  2. Enter 确认文件名
  3. Ctrl + X 退出 nano

接下来,我们需要让脚本可执行:

chmod +x ~/project/long_running.sh

现在,让我们先在前台执行该脚本,看看它是如何工作的:

./long_running.sh

你会看到:

Starting a long process...

注意,在脚本完成之前,你的终端会被占用 15 秒。在此期间,你无法输入新命令。

现在,让我们通过在末尾添加一个与符号 (&) 来在后台运行同一个脚本:

./long_running.sh &

你会看到类似如下的输出:

[1] 1234
Starting a long process...

输出显示:

  • [1] - shell 分配的作业编号
  • 1234 - 进程 ID (PID),在你的系统上这个数字会不同
  • 脚本的启动消息

即使脚本仍在运行,你的 shell 提示符会立即返回,允许你输入新命令。15 秒后,你会看到完成消息出现:

Process completed
[1]+  Done                    ./long_running.sh

这确认了后台进程已完成执行。

查看后台进程

在后台启动进程后,你需要知道如何跟踪它们。Linux 提供了 jobs 命令来显示当前终端会话中运行的所有后台进程。

让我们启动多个后台进程,然后查看它们:

## Start the first background process
./long_running.sh &

你会看到类似如下的输出:

[1] 1234
Starting a long process...

现在启动第二个后台进程:

## Start the second background process
./long_running.sh &

你会看到类似如下的输出:

[2] 1235
Starting a long process...

要查看所有后台进程(作业),使用 jobs 命令:

jobs

你应该会看到类似如下的输出:

[1]  Running                 ./long_running.sh &
[2]- Running                 ./long_running.sh &

这表明你有两个后台作业正在运行。方括号中的数字是作业 ID,你可以在使用其他命令时用它们来引用特定的作业。

jobs 命令支持几个有用的选项:

  • jobs -l - 显示作业信息以及进程 ID
  • jobs -p - 仅显示作业的进程 ID

尝试使用 -l 选项查看更多详细信息:

jobs -l

输出将包含进程 ID:

[1]  1234 Running                 ./long_running.sh &
[2]- 1235 Running                 ./long_running.sh &

在进行下一步之前,等待两个进程都完成。你会看到类似如下的消息:

Process completed
[1]+  Done                    ./long_running.sh
Process completed
[2]+  Done                    ./long_running.sh

在前台和后台之间移动进程

Linux 允许你在前台和后台状态之间移动进程。在以下情况下,这特别有用:

  • 你在前台启动了一个进程,需要使用终端做其他事情
  • 你想将一个后台进程带到前台与之交互

让我们学习如何使用 fg(前台)和 bg(后台)命令,以及进程挂起功能来实现这一点。

首先,在前台启动我们的长时间运行脚本(不使用 &):

./long_running.sh

你会看到:

Starting a long process...

注意,你的 shell 提示符不会返回——终端现在被这个在前台运行的进程占用了。

要挂起(暂停)这个进程并重新获得对终端的控制权:

  1. 按下 Ctrl + Z

你会看到类似如下的输出:

^Z
[1]+  Stopped                 ./long_running.sh

现在进程已被挂起,不再运行。你可以使用 jobs 命令来确认这一点:

jobs

输出:

[1]+  Stopped                 ./long_running.sh

要在后台恢复被挂起的进程,使用 bg 命令:

bg %1

%1 指的是作业编号 1。你会看到:

[1]+ ./long_running.sh &

现在进程在后台运行。使用 jobs 命令确认:

jobs

输出:

[1]+  Running                 ./long_running.sh &

要将一个后台进程带到前台,使用 fg 命令:

fg %1

现在进程将再次在前台运行,并且你的终端将被占用,直到它完成:

./long_running.sh
Process completed

进程完成后,你的 shell 提示符将返回。

让进程在终端关闭后继续运行

当你使用 & 在后台运行一个进程时,如果你关闭终端,该进程将会终止。若要让进程在终端关闭后仍继续运行,你可以使用 nohup 命令。

nohup(“no hang up” 的缩写)可防止进程接收 SIGHUP(挂起)信号,当终端关闭时,该信号会被发送给进程。

让我们修改脚本,使其运行时间更长:

nano ~/project/long_running.sh

将内容更新为:

#!/bin/bash
echo "Starting a very long process..."
sleep 60
echo "Process completed" > ~/project/completed.txt

保存并退出 nano(Ctrl+O,回车,Ctrl+X)。

现在,让我们使用 nohup 运行脚本:

nohup ./long_running.sh &

你会看到类似如下的输出:

[1] 1234
nohup: ignoring input and appending output to 'nohup.out'

脚本的输出不会显示在终端中,而是被重定向到一个名为 nohup.out 的文件中。你可以查看这个文件:

cat nohup.out

你应该会看到:

Starting a very long process...

即使你现在关闭终端,进程仍会继续运行。当进程完成时,它会同时写入 nohup.outcompleted.txt 文件。

要查看所有终端中在后台运行的进程,使用 ps 命令:

ps aux | grep long_running.sh

你会看到类似如下的内容:

labex     1234  0.0  0.0   8160   736 pts/0    S    12:34   0:00 /bin/bash ./long_running.sh
labex     1235  0.0  0.0  14428  1020 pts/0    S+   12:34   0:00 grep --color=auto long_running.sh

等待进程完成(或者如果你愿意,也可以终止它):

## If you want to terminate the process:
kill %1

总结

在本次实验中,你学习了在 Linux 中管理后台进程的重要技巧:

  1. 启动后台进程:你学会了如何使用 & 运算符在后台启动进程,这样在进程运行时你可以继续使用终端。
  2. 查看后台进程:你使用 jobs 命令查看当前终端会话中运行的所有后台进程。
  3. 在前台和后台之间移动进程:你练习了使用 Ctrl+Z 挂起进程,使用 bg 命令让进程在后台继续运行,以及使用 fg 命令将进程带到前台。
  4. 让进程在终端关闭后继续运行:你使用 nohup 命令让进程即使在终端会话结束后仍能继续运行。

这些技能对于在 Linux 环境中进行有效的多任务处理至关重要。它们使你能够同时运行多个进程,有效利用终端资源,在不保持终端打开的情况下维持长时间运行的进程,并管理进程的执行状态。

掌握这些技巧后,无论你是在管理服务器、开发应用程序还是执行系统管理任务,都能在 Linux 命令行环境中更高效、更有效地工作。