bg命令 #
bg
命令(background)用于将已停止(暂停)的作业放到后台运行。它是shell内置命令,是作业控制功能的一部分。
语法 #
bg [作业ID...]
作业ID #
作业ID可以使用以下格式指定:
格式 | 描述 |
---|---|
%n |
作业号为n的作业 |
%str |
命令以str开头的作业 |
%?str |
命令包含str的作业 |
%% 或 %+ |
当前作业(最近放入后台或停止的作业) |
%- |
上一个作业(当前作业之前的作业) |
如果不指定作业ID,bg
命令默认操作当前作业(%+
或%%
)。
常见用法 #
1. 将当前暂停的作业放到后台运行 #
bg
2. 将特定作业放到后台运行 #
bg %1
3. 将多个作业放到后台运行 #
bg %1 %2 %3
4. 将命令以特定字符串开头的作业放到后台运行 #
bg %find
这会将命令以"find"开头的作业放到后台运行。
5. 将包含特定字符串的作业放到后台运行 #
bg %?txt
这会将命令包含"txt"的作业放到后台运行。
作业控制流程 #
典型的作业控制流程如下:
- 启动一个长时间运行的命令
- 按下
Ctrl+Z
暂停该命令 - 使用
bg
命令将其放到后台运行 - 使用
jobs
命令查看作业状态 - 如果需要,使用
fg
命令将其带回前台
实用示例 #
1. 启动、暂停并后台运行命令 #
# 启动一个长时间运行的命令
find / -name "*.txt"
# 按Ctrl+Z暂停
[1]+ Stopped find / -name "*.txt"
# 将其放到后台运行
bg
[1]+ find / -name "*.txt" &
2. 启动多个命令并管理它们 #
# 启动第一个命令
find / -name "*.txt"
# 按Ctrl+Z暂停
[1]+ Stopped find / -name "*.txt"
# 启动第二个命令
find / -name "*.log"
# 按Ctrl+Z暂停
[2]+ Stopped find / -name "*.log"
# 查看作业
jobs
[1]- Stopped find / -name "*.txt"
[2]+ Stopped find / -name "*.log"
# 将第一个作业放到后台运行
bg %1
[1]- find / -name "*.txt" &
# 将第二个作业放到后台运行
bg %2
[2]+ find / -name "*.log" &
3. 暂停交互式程序并在后台继续 #
# 启动vim
vim file.txt
# 按Ctrl+Z暂停
[1]+ Stopped vim file.txt
# 尝试在后台继续运行(注意:这通常不适用于交互式程序)
bg
注意:像vim这样的交互式程序通常不适合在后台运行,因为它们需要用户输入。
4. 暂停命令,修改其输出重定向,然后在后台继续 #
# 启动一个命令
find / -name "*.txt"
# 按Ctrl+Z暂停
[1]+ Stopped find / -name "*.txt"
# 将其放到后台运行,并重定向输出
bg 1 > results.txt 2>&1
注意:这种方法在大多数shell中不起作用,因为bg
命令不能修改作业的重定向。正确的方法是从一开始就设置重定向:
find / -name "*.txt" > results.txt 2>&1 &
5. 在脚本中使用bg命令 #
#!/bin/bash
# 启用作业控制
set -m
# 启动一个长时间运行的命令
find / -name "*.txt"
# 暂停它(在脚本中这需要特殊处理)
kill -STOP $$
# 将其放到后台运行
bg
# 继续执行其他命令
echo "Find command is now running in the background"
注意:在脚本中使用作业控制通常比较复杂,不推荐这种方法。更好的方法是直接使用&
操作符在后台启动命令。
与其他命令的关系 #
bg
命令通常与以下命令一起使用:
jobs
:列出当前shell会话中的作业fg
:将后台作业带到前台运行Ctrl+Z
:暂停当前前台作业kill
:向作业发送信号(如终止信号)wait
:等待后台作业完成disown
:从当前shell的作业表中移除作业
注意事项 #
-
bg
命令只能操作当前shell会话中的作业,不能操作其他终端或会话中的作业。 -
当shell会话终止时,所有后台作业通常也会终止,除非使用
nohup
或disown
命令。 -
后台作业的输出仍然会显示在终端上,可能会干扰用户操作。可以使用重定向来避免这种情况。
-
交互式程序(如vim、nano等)通常不适合在后台运行,因为它们需要用户输入。
-
在某些shell中,
bg
命令可能不可用或行为不同。
提示 #
- 使用
jobs
命令可以查看当前shell会话中的所有作业 - 使用
bg
命令前,确保作业已经被暂停(通常通过Ctrl+Z
) - 对于需要在用户注销后继续运行的作业,使用
nohup
命令或disown
命令 - 如果需要从一开始就在后台运行命令,直接使用
&
操作符 - 在后台运行可能产生大量输出的命令时,考虑重定向输出到文件
- 使用
kill
命令可以向后台作业发送信号,如终止信号 - 使用
wait
命令可以等待所有后台作业完成