jobs命令

jobs命令 #

jobs命令用于列出当前shell会话中的作业(任务)及其状态。它是shell内置命令,可以帮助用户管理在后台或暂停状态下运行的进程。

语法 #

jobs [选项] [作业ID...]

常用选项 #

选项 描述
-l 显示进程ID和作业信息
-p 只显示进程ID
-n 只显示自上次通知以来状态发生变化的作业
-r 只显示运行中的作业
-s 只显示已停止的作业
-x 命令 将命令中的任何作业ID替换为相应的进程ID,然后执行命令

作业状态 #

jobs命令显示的作业状态包括:

状态 描述
Running 作业正在运行
Stopped 作业已停止(暂停)
Terminated 作业已终止
Done 作业已完成
Done(code) 作业已完成,退出码为code

作业控制符号 #

在shell中,可以使用以下符号引用作业:

符号 描述
%n 作业号为n的作业
%str 命令以str开头的作业
%?str 命令包含str的作业
%%%+ 当前作业(最近放入后台或停止的作业)
%- 上一个作业(当前作业之前的作业)

常见用法 #

1. 列出所有作业 #

jobs

输出示例:

[1]  + running    sleep 100
[2]  - stopped    vim file.txt
[3]    running    find / -name "*.txt" > results.txt

2. 显示作业的进程ID #

jobs -l

输出示例:

[1]  + 1234 running    sleep 100
[2]  - 5678 stopped    vim file.txt
[3]    9012 running    find / -name "*.txt" > results.txt

3. 只显示进程ID #

jobs -p

输出示例:

1234
5678
9012

4. 只显示运行中的作业 #

jobs -r

5. 只显示已停止的作业 #

jobs -s

6. 显示特定作业的信息 #

jobs %1

7. 将作业ID转换为进程ID #

jobs -x echo %1

与其他命令结合使用 #

1. 创建后台作业 #

sleep 100 &

2. 暂停前台作业 #

按下Ctrl+Z可以暂停当前前台作业。

3. 将作业放到后台运行 #

bg %1

4. 将作业放到前台运行 #

fg %1

5. 终止作业 #

kill %1

6. 等待所有后台作业完成 #

wait

7. 等待特定作业完成 #

wait %1

实用示例 #

1. 启动多个后台作业并监控 #

sleep 100 &
sleep 200 &
sleep 300 &
jobs

2. 暂停和恢复作业 #

# 启动一个长时间运行的命令
find / -name "*.txt" > results.txt
# 按Ctrl+Z暂停
jobs  # 查看作业状态
bg %1  # 在后台继续运行

3. 在后台运行命令并在完成时通知 #

(sleep 10; echo "Done!") &

4. 在后台运行多个命令 #

(command1; command2; command3) &

5. 终止所有后台作业 #

kill $(jobs -p)

6. 将暂停的作业移到后台 #

# 启动vim
vim file.txt
# 按Ctrl+Z暂停
jobs  # 查看作业状态
bg %1  # 在后台继续运行vim(注意:这通常不适用于交互式程序)

7. 在后台运行命令并将输出重定向 #

command > output.log 2>&1 &

作业控制与进程管理 #

作业控制是shell提供的一种功能,允许用户在单个终端会话中管理多个进程。主要命令包括:

命令 描述
jobs 列出当前shell会话中的作业
bg 将作业放到后台运行
fg 将作业放到前台运行
Ctrl+Z 暂停当前前台作业
Ctrl+C 终止当前前台作业
&(命令后缀) 在后台启动命令
wait 等待所有后台作业完成
disown 从当前shell的作业表中移除作业

与其他进程管理命令的区别 #

  • jobs只显示当前shell会话中的作业
  • ps显示系统中的所有进程
  • tophtop提供实时的进程监控
  • pgreppkill可以根据名称查找和操作进程

注意事项 #

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

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

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

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

  5. 在脚本中使用作业控制时,需要确保shell启用了作业控制功能(通常通过set -mset -o monitor)。

提示 #

  • 使用jobs -l可以同时查看作业号和进程ID
  • 使用%+%%可以引用最近的作业
  • 使用%-可以引用上一个作业
  • 在终止shell会话前,检查是否有重要的后台作业正在运行
  • 对于需要在用户注销后继续运行的作业,使用nohup命令或disown命令
  • 使用bgfg命令可以在前台和后台之间切换作业
  • 在脚本中,可以使用wait命令等待后台作业完成
  • 使用jobs -x可以将作业ID转换为进程ID,这在某些需要进程ID的命令中很有用