简介
Linux 具备强大的能力,可以同时管理多个进程。其关键特性之一是能够在后台运行进程,这使你在长时间运行的进程执行时,仍可继续使用终端进行其他任务。
在这个实验中,你将学习在 Linux 系统中管理后台进程的重要技巧。这些技能对于在命令行环境中进行高效的多任务处理至关重要,并且系统管理员和开发人员经常会用到。
在本实验结束时,你将了解如何启动后台进程、监控它们的状态并有效地控制它们。这些技能将帮助你更好地利用系统资源,并在使用 Linux 系统时提高你的工作效率。
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"
这个脚本:
要在 nano 中保存文件:
Ctrl
+ O
写入文件Enter
确认文件名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
- 显示作业信息以及进程 IDjobs -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 提示符不会返回——终端现在被这个在前台运行的进程占用了。
要挂起(暂停)这个进程并重新获得对终端的控制权:
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.out
和 completed.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 中管理后台进程的重要技巧:
&
运算符在后台启动进程,这样在进程运行时你可以继续使用终端。jobs
命令查看当前终端会话中运行的所有后台进程。Ctrl+Z
挂起进程,使用 bg
命令让进程在后台继续运行,以及使用 fg
命令将进程带到前台。nohup
命令让进程即使在终端会话结束后仍能继续运行。这些技能对于在 Linux 环境中进行有效的多任务处理至关重要。它们使你能够同时运行多个进程,有效利用终端资源,在不保持终端打开的情况下维持长时间运行的进程,并管理进程的执行状态。
掌握这些技巧后,无论你是在管理服务器、开发应用程序还是执行系统管理任务,都能在 Linux 命令行环境中更高效、更有效地工作。