jobs
列出当前 shell 会话中的活动作业
用于查看后台或停止的作业状态,支持按条件过滤输出,并可将作业号转换为进程组 ID 后执行命令。
- 功能:显示当前 shell 管理的作业列表(包括后台运行、已停止的作业),并支持通过选项筛选输出内容。
- 默认行为:无选项时,列出所有作业的作业号、状态及命令名(如
[1]+ Running sleep 100
)。 - 作业标识:作业可通过
jobspec
指定(如%1
表示作业1,%+
表示当前作业)。
基本语法
jobs [-lnprs] [jobspec ...] # 列出作业
jobs -x command [args ...] # 替换 jobspec 并执行命令
核心选项
选项 | 功能说明 |
---|---|
-l | 显示作业的进程 ID(PID)和进程组 ID(PGID)。 |
-n | 仅显示自上次状态通知后状态发生改变的作业。 |
-p | 仅输出作业的进程组 leader 的 PID(用于脚本提取 PID)。 |
-r | 仅列出正在运行的作业。 |
-s | 仅列出已停止的作业。 |
-x | 将命令中的 jobspec 替换为对应的进程组 ID,再执行命令(如 jobs -x kill %1 )。 |
作业状态与标识
- 作业号(Job Spec):
%n
:作业编号(如%1
)。%%
或%+
:当前作业(最近停止或后台运行的作业)。%-
:前一个作业。
- 状态:
Running
:作业正在前台或后台运行。Stopped
:作业被信号暂停(如 Ctrl+Z)。
常见示例
1. 默认列出所有作业
jobs
# 示例输出:
# [1] Running sleep 100 &
# [2]- Stopped vi
# [3]+ Stopped find / -name "test"
2. 列出作业及进程信息
jobs -l
# 示例输出:
# [1] 1234 Running sleep 100 &
# [2]- 5678 Stopped vi
# [3]+ 9101 Stopped find / -name "test"
3. 仅列出运行中的作业
jobs -r
# 输出所有 Running 状态的作业
4. 获取作业的进程组 leader PID
jobs -p %1
# 输出作业 %1 的进程组 leader 的 PID(如 1234)
5. 替换 jobspec 并执行命令
jobs -x kill -9 %1
# 将 %1 替换为 PGID 后执行:kill -9 1234
注意事项
- 作业控制依赖:
- 需启用作业控制(默认在交互式 shell 中启用),可通过
set -m
显式启用。
- 需启用作业控制(默认在交互式 shell 中启用),可通过
- jobspec 有效性:
- 若指定的
jobspec
不存在,返回错误(退出码非0)。
- 若指定的
- 输出过滤优先级:
-r
和-s
互斥,若同时指定,以最后出现的选项为准。
- 脚本中使用:
-p
选项适合在脚本中提取作业的 PID 进行后续操作。
- 安全限制:
- 无法操作不属于当前 shell 会话的作业。
返回值
- 成功:0(无错误,或命令执行成功)。
- 失败:非0(无效选项、无效
jobspec
,或命令执行失败)。
相关命令
- 启动作业:
sleep 100 & # 后台运行 Ctrl+Z # 暂停前台作业 bg # 将暂停的作业放到后台继续运行 fg %1 # 将作业 %1 调回前台
- 查看进程:
ps -ef | grep job_name # 查看进程详细信息