Linux查看当前终端放入后台的工作:jobs命令全面指南
在Linux终端中,我们经常需要同时处理多个任务——比如运行一个耗时的脚本时,还想继续执行其他命令。作业控制(Job Control) 是Linux shell的核心功能之一,它允许我们将进程暂停、放入后台运行,或重新调回前台交互。而 jobs 命令则是作业控制的"仪表盘"——它能帮我们查看当前终端会话中所有后台或暂停的作业状态,是管理终端任务的关键工具。
本文将从基础到进阶,全面解析 jobs 命令的用法、常见场景与最佳实践。无论你是Linux新手还是资深用户,都能通过本文掌握高效管理终端作业的技巧。
目录#
- 什么是jobs命令?
- jobs命令的基础语法
- 常用选项解析
- 理解jobs的输出格式
- 作业状态详解
- 作业标识符:如何引用后台工作?
- jobs命令的典型使用场景
- 最佳实践:高效管理终端作业
- 常见问题与 troubleshooting
- 总结
- 参考资料
1. 什么是jobs命令?#
jobs 是Shell内置命令(Shell Built-in),用于列出当前终端会话中所有与Shell关联的后台作业(Background Jobs) 和 暂停作业(Stopped Jobs)。它的核心作用是:
- 跟踪当前终端的所有活跃作业(未完成或未被销毁的进程)
- 显示作业的状态(运行中、暂停、已完成)
- 提供作业的唯一标识(作业号、PID)以便管理
关键特性#
- 会话特异性:
jobs仅显示当前终端会话的作业。如果你打开新的终端窗口或标签页,之前的作业不会出现在新会话的jobs列表中。 - Shell依赖性:
jobs是Shell内置命令(如bash、zsh、ksh支持),sh(POSIX shell)不支持该命令。 - 动态更新:
jobs实时反映作业状态——当作业暂停、恢复或终止时,jobs的输出会随之变化。
2. jobs命令的基础语法#
jobs 命令的语法非常简洁:
jobs [选项] [作业标识...]- 选项:调整输出格式或过滤作业(如
-l显示PID、-r仅显示运行中的作业)。 - 作业标识:可选参数,指定要查看的作业(如
%1表示作业1)。若不指定,则显示所有作业。
3. 常用选项解析#
jobs 支持多个选项以满足不同需求,以下是最常用的几个:
| 选项 | 说明 | 示例 |
|---|---|---|
-l | 长格式输出:显示作业号、PID、状态和命令 | jobs -l → 输出包含PID |
-p | 仅显示PID:仅输出作业的进程ID(方便管道传递给其他命令) | jobs -p → 仅返回PID列表 |
-n | 仅显示状态变化的作业:仅列出自上次查看后状态改变的作业(如从运行变暂停) | jobs -n → 显示最近变化的作业 |
-r | 仅显示运行中的作业:过滤出处于Running状态的作业 | jobs -r → 仅运行中作业 |
-s | 仅显示暂停的作业:过滤出处于Stopped状态的作业 | jobs -s → 仅暂停作业 |
示例:选项的实际效果#
假设我们启动两个后台作业:
$ sleep 60 & # 作业1:后台运行60秒
[1] 12345 # Shell返回作业号[1]和PID 12345
$ sleep 120 & # 作业2:后台运行120秒
[2] 123461. 基础输出(无选项)#
$ jobs
[1]- Running sleep 60 &
[2]+ Running sleep 120 &2. 长格式输出(-l)#
$ jobs -l
[1]- 12345 Running sleep 60 &
[2]+ 12346 Running sleep 120 &→ 增加了PID(如12345),方便直接操作进程。
3. 仅显示PID(-p)#
$ jobs -p
12345
12346→ 仅输出PID,可直接传递给kill或ps:
$ kill $(jobs -p) # 终止所有后台作业4. 仅显示状态变化的作业(-n)#
假设我们暂停作业2:
$ fg %2 # 将作业2调回前台
sleep 120
^Z # 按Ctrl+Z暂停作业
[2]+ Stopped sleep 120此时用jobs -n会显示状态变化的作业2:
$ jobs -n
[2]+ Stopped sleep 1205. 过滤运行中的作业(-r)#
$ jobs -r
[1]- Running sleep 60 &→ 仅显示作业1(作业2已暂停)。
4. 理解jobs的输出格式#
jobs 的输出每一行对应一个作业,包含5个关键部分:
[作业号][±] 状态 命令
逐字段解析#
以示例输出为例:
[1]- Running sleep 60 &
[2]+ Stopped sleep 120- 作业号(Job Number):
[1]和[2]——Shell为每个作业分配的唯一编号,用于标识作业(如%1表示作业1)。 - 作业优先级(±):
+:当前作业(Current Job)——最近交互过的作业(如刚暂停或启动的作业)。-:** previous作业**——次近交互的作业。- 无符号:其他作业。
- 关键规则:使用
fg/bg时,若不指定作业标识,默认操作当前作业(+)。
- 状态(State):作业的当前状态(如
Running、Stopped,详见第5节)。 - 命令(Command):启动作业的原始命令(如
sleep 60 &)。
5. 作业状态详解#
jobs 输出中的状态字段是作业的核心信息,常见状态如下:
| 状态 | 说明 | 触发场景 |
|---|---|---|
Running | 作业正在后台运行 | 用&启动的作业(如sleep 60 &)或用bg恢复的作业 |
Stopped | 作业被暂停(未终止) | 按Ctrl+Z或发送SIGSTOP信号(如kill -STOP %1) |
Done | 作业成功完成(退出码0) | 作业正常结束(如sleep 1运行完毕) |
Done(code) | 作业异常终止(退出码≠0) | 作业因错误终止(如kill %1或命令执行失败) |
Terminated | 作业被强制终止 | 发送SIGTERM(默认)或SIGKILL信号(如kill -9 %1) |
示例:状态的变化#
-
启动作业(Running):
$ sleep 60 & [1] 12345 $ jobs [1]+ Running sleep 60 & -
暂停作业(Stopped):
$ fg %1 # 调回前台 sleep 60 ^Z # 按Ctrl+Z暂停 [1]+ Stopped sleep 60 -
恢复作业(Running):
$ bg %1 # 后台恢复 [1]+ sleep 60 & $ jobs [1]+ Running sleep 60 & -
正常完成(Done):
$ wait %1 # 等待作业1完成 $ jobs [1]+ Done sleep 60 -
强制终止(Terminated):
$ kill %1 # 发送SIGTERM信号 $ jobs [1]+ Terminated sleep 60
6. 作业标识符:如何引用后台工作?#
要操作后台作业(如恢复、终止),需用作业标识符指定目标作业。jobs 支持3种标识符格式:
1. 作业号标识符(最常用)#
格式:%作业号(如%1表示作业1)。
示例:
fg %1 # 将作业1调回前台
bg %2 # 将作业2恢复到后台
kill %3 # 终止作业32. 命令字符串标识符#
%字符串:匹配命令开头的作业(如%sleep匹配以sleep开头的作业)。%?字符串:匹配命令任意位置的作业(如%?60匹配包含60的命令)。
示例:
$ sleep 60 &
[1] 12345
$ sleep 120 &
[2] 12346
$ fg %sleep # 操作以sleep开头的作业(作业1)
sleep 60
$ fg %?120 # 操作包含120的作业(作业2)
sleep 1203. 特殊标识符#
%%或%+:当前作业(+标识的作业)。%-:previous作业(-标识的作业)。
示例:
$ jobs
[1]- Running sleep 60 &
[2]+ Running sleep 120 &
$ fg %% # 操作当前作业(作业2)
sleep 120
$ fg %- # 操作previous作业(作业1)
sleep 607. jobs命令的典型使用场景#
场景1:启动并跟踪后台作业#
需求:运行一个耗时脚本,同时继续使用终端。
操作:
$ ./long-running-script.sh & # 用&启动后台作业
[1] 12345
$ jobs -l # 查看作业状态(含PID)
[1]+ 12345 Running ./long-running-script.sh &场景2:暂停并恢复作业#
需求:正在编辑文件时,需要临时处理其他任务。
操作:
$ nano report.txt # 前台编辑文件
^Z # 按Ctrl+Z暂停(作业进入Stopped状态)
[1]+ Stopped nano report.txt
$ jobs -s # 确认暂停的作业
[1]+ Stopped nano report.txt
$ bg %1 # 后台恢复作业(继续编辑,但在后台)
[1]+ nano report.txt &
$ fg %1 # 调回前台继续编辑场景3:终止无响应的后台作业#
需求:后台作业无响应,需要强制终止。
操作:
$ jobs -l # 查看作业的PID或作业号
[1]+ 12345 Running ./hung-script.sh &
$ kill -9 %1 # 发送SIGKILL信号强制终止(或用PID:kill -9 12345)
$ jobs
[1]+ Killed ./hung-script.sh场景4:脚本中跟踪多个后台作业#
需求:在脚本中启动多个后台任务,并获取每个任务的退出码。
操作:利用$!(获取最后一个后台作业的PID)和wait(等待作业完成):
#!/bin/bash
# 启动两个后台作业并保存PID
sleep 5 & pid1=$!
sleep 10 & pid2=$!
# 等待作业完成并获取退出码
wait $pid1; exit1=$?
wait $pid2; exit2=$?
# 输出结果
echo "作业1(PID $pid1)退出码:$exit1"
echo "作业2(PID $pid2)退出码:$exit2"运行结果:
$ ./multi-job.sh
作业1(PID 12345)退出码:0
作业2(PID 12346)退出码:08. 最佳实践:高效管理终端作业#
1. 交互式使用:优先用作业号,精准操作#
- 用
jobs查看作业号后,用%作业号操作(如fg %1)——比字符串匹配更精准。 - 利用
±标识快速操作:若只需处理最近的作业,直接用fg/bg(默认操作+作业)。
2. 脚本中:优先用PID,避免依赖作业号#
- 作业号是会话特异性的,脚本中启动多个作业时,作业号可能混乱。
- 用
$!获取PID,并保存到变量(如pid=$!),之后用kill $pid或wait $pid操作——更可靠。
3. 清理完成的作业#
- 完成的作业(
Done状态)会占用作业列表,可通过以下方式清理:- 运行任意命令(如
echo "")——Shell会自动清除Done作业。 - 用
disown命令:disown %1——将作业从列表中移除(但不终止作业)。
- 运行任意命令(如
4. 避免后台运行需要交互的程序#
- 某些程序(如
nano、vi)需要终端输入,若用&启动,会立即进入Stopped状态(因无法获取输入)。 - 解决方案:若需后台运行交互程序,用
screen或tmux(终端复用工具)。
5. 长期运行的作业:用nohup或disown#
- 默认情况下,关闭终端会向所有作业发送
SIGHUP信号(终止作业)。 - 若需作业存活终端关闭,需:
- 用
nohup启动:nohup sleep 3600 &——将输出重定向到nohup.out,并忽略SIGHUP。 - 用
disown:sleep 3600 & disown——将作业从Shell的作业列表中移除,避免SIGHUP。
- 用
9. 常见问题与 troubleshooting#
问题1:jobs命令找不到(jobs: command not found)#
- 原因:使用了不支持
jobs的Shell(如sh)。 - 解决:切换到bash或zsh:
bash→ 再运行jobs。
问题2:作业不在jobs列表中#
- 可能原因:
- 作业在不同终端会话中(如另一个标签页或窗口)。
- 作业被
disown(已从列表中移除)。 - 作业运行在子Shell中(如
(sleep 60 &)——子Shell的作业不影响父Shell)。 - 作业已完成(
Done状态)且Shell已清理列表。
- 解决:
- 确认终端会话:
echo $TERM——同一终端的TERM值相同。 - 用
ps aux | grep 命令名查找PID(如ps aux | grep sleep)。
- 确认终端会话:
问题3:用bg恢复作业后,立即回到Stopped状态#
- 原因:作业需要终端输入(如
nano),后台无法提供输入。 - 解决:用
fg调回前台,完成交互后再后台运行(或用screen)。
问题4:无法终止作业(kill %1无效)#
- 原因:作业可能处于**不可中断睡眠状态(D状态)**或忽略
SIGTERM信号。 - 解决:发送
SIGKILL信号(强制终止):kill -9 %1或kill -9 PID。
10. 总结#
jobs 命令是Linux终端作业控制的"眼睛"——它帮我们清晰掌握后台作业的状态,是高效管理多任务的核心工具。通过本文,你应该掌握:
jobs的基础语法与常用选项(如-l、-p)。- 作业状态的含义与标识符的使用(如
%1、%%)。 - 常见场景的处理(如启动、暂停、恢复、终止作业)。
- 最佳实践(如脚本用PID、长期作业用
nohup)。
作业控制是Linux终端的核心技能之一,多练习jobs、fg、bg等命令,能显著提升你的终端效率!
11. 参考资料#
- Bash参考手册:Job Control
- Zsh手册:Shell Built-in Commands
- TLDP(Linux文档项目):Job Control Basics
- man手册:
man bash(搜索"JOB CONTROL"部分)或help jobs(bash内置帮助)
通过以上资料,你可以深入学习Shell作业控制的底层原理与更多高级技巧!