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
显示系统中的所有进程top
和htop
提供实时的进程监控pgrep
和pkill
可以根据名称查找和操作进程
注意事项 #
-
jobs
命令只能显示当前shell会话中的作业,不能显示其他终端或会话中的作业。 -
当shell会话终止时,所有作业通常也会终止,除非使用
nohup
或disown
命令。 -
在某些shell中,后台作业的输出仍然会显示在终端上,可能会干扰用户操作。可以使用重定向来避免这种情况。
-
交互式程序(如vim、nano等)通常不适合在后台运行,因为它们需要用户输入。
-
在脚本中使用作业控制时,需要确保shell启用了作业控制功能(通常通过
set -m
或set -o monitor
)。
提示 #
- 使用
jobs -l
可以同时查看作业号和进程ID - 使用
%+
或%%
可以引用最近的作业 - 使用
%-
可以引用上一个作业 - 在终止shell会话前,检查是否有重要的后台作业正在运行
- 对于需要在用户注销后继续运行的作业,使用
nohup
命令或disown
命令 - 使用
bg
和fg
命令可以在前台和后台之间切换作业 - 在脚本中,可以使用
wait
命令等待后台作业完成 - 使用
jobs -x
可以将作业ID转换为进程ID,这在某些需要进程ID的命令中很有用