bg命令

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"的作业放到后台运行。

作业控制流程 #

典型的作业控制流程如下:

  1. 启动一个长时间运行的命令
  2. 按下Ctrl+Z暂停该命令
  3. 使用bg命令将其放到后台运行
  4. 使用jobs命令查看作业状态
  5. 如果需要,使用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的作业表中移除作业

注意事项 #

  1. bg命令只能操作当前shell会话中的作业,不能操作其他终端或会话中的作业。

  2. 当shell会话终止时,所有后台作业通常也会终止,除非使用nohupdisown命令。

  3. 后台作业的输出仍然会显示在终端上,可能会干扰用户操作。可以使用重定向来避免这种情况。

  4. 交互式程序(如vim、nano等)通常不适合在后台运行,因为它们需要用户输入。

  5. 在某些shell中,bg命令可能不可用或行为不同。

提示 #

  • 使用jobs命令可以查看当前shell会话中的所有作业
  • 使用bg命令前,确保作业已经被暂停(通常通过Ctrl+Z
  • 对于需要在用户注销后继续运行的作业,使用nohup命令或disown命令
  • 如果需要从一开始就在后台运行命令,直接使用&操作符
  • 在后台运行可能产生大量输出的命令时,考虑重定向输出到文件
  • 使用kill命令可以向后台作业发送信号,如终止信号
  • 使用wait命令可以等待所有后台作业完成