4.2.2 常用作业控制命令:jobs、bg、fg、nohup、disown
作业控制命令用于在同一终端会话中管理前台/后台作业的运行状态,适用于长任务、临时离开终端或批量管理进程的场景。本节聚焦 jobs、bg、fg、nohup、disown 的核心用法、交互关系与常见注意事项,并给出可执行示例、排错与练习。
jobs:查看当前会话作业#
- 作用:列出当前 shell 会话中的后台作业与状态。
- 常用格式:
jobs、jobs -l(显示 PID)、jobs -p(仅 PID)。 - 状态标识:
Running(运行中)、Stopped(被挂起)、Done(已完成)。 - 安装说明:内建于 bash/zsh,无需安装。
命令说明与示例:
# 启动两个后台作业
sleep 300 &
sleep 400 &
# 查看作业列表
jobs
# 显示作业PID与作业号
jobs -l
预期效果:
- 输出包含类似 [1] Running sleep 300 &。
- -l 输出附带 PID,便于与 ps 对照。
排错:
- jobs 没有输出:说明当前会话未启动后台作业。
- SSH 重连后看不到:作业控制仅对当前会话有效。
bg:将作业转入后台继续运行#
- 作用:把已暂停(Stopped)的作业放到后台继续运行。
- 典型流程:前台运行后按
Ctrl+Z挂起 →bg %1继续后台运行。 - 注意事项:
bg只对已停止的作业有效,不改变输出目标,仍可能占用终端输出。
命令说明与示例:
# 前台启动一个可观察的任务
ping 127.0.0.1
# 按 Ctrl+Z 挂起后,查看作业
jobs
# 将最近的停止作业放到后台
bg
预期效果:
- jobs 显示 Stopped,执行 bg 后变为 Running。
- 终端继续出现 ping 输出。
排错:
- bg: no such job:检查作业号或确认作业是否仍存在。
- 输出干扰终端:后台作业请重定向输出。
fg:将作业调回前台#
- 作用:把后台作业切换回前台,占用当前终端并接收输入。
- 用法:
fg %1或fg(默认最近作业)。 - 场景:需要交互操作或查看实时输出时使用。
命令说明与示例:
# 先准备一个后台作业
sleep 600 &
jobs
# 调回前台
fg %1
预期效果:
- 终端被该作业占用,直至作业结束或被挂起/中断。
排错:
- fg: no job control:可能在非交互 shell,或禁用了作业控制。
nohup:脱离终端运行#
- 作用:忽略 SIGHUP 信号,即使终端关闭也继续运行。
- 用法示例:
nohup command > nohup.out 2>&1 & - 输出处理:默认输出到
nohup.out,建议显式重定向日志。 - 适用场景:长时间任务、远程会话不稳定环境。
命令说明与示例:
# 启动一个模拟长任务并写入日志
nohup bash -c 'for i in {1..5}; do date; sleep 2; done' \
> /tmp/longtask.log 2>&1 &
# 查看进程与日志
ps -ef | grep longtask | grep -v grep
tail -f /tmp/longtask.log
预期效果:
- 退出终端后进程仍运行,日志持续写入 /tmp/longtask.log。
排错:
- 日志不写入:检查重定向路径权限。
- 进程仍退出:可能被其他信号终止,查看 dmesg 或系统日志。
disown:从作业表中移除#
- 作用:将作业从 shell 的作业控制列表中移除,使其不再受会话控制。
- 用法:
disown %1或disown -a(移除所有)、disown -h %1(仅忽略 SIGHUP)。 - 区别点:与
nohup不同,disown不改变信号处理方式,需结合-h或先用nohup启动。
命令说明与示例:
# 启动后台作业
sleep 1000 &
jobs -l
# 将其从作业表移除
disown %1
# 再次查看作业表为空
jobs
预期效果:
- jobs 不再显示该进程,但进程仍存在。
排错:
- disown: no such job:作业号错误或已完成。
- 终端关闭后进程退出:使用 disown -h 或 nohup。
常见组合与建议#
完整可执行流程示例:
# 1) 启动后台任务并记录日志
bash -c 'for i in {1..10}; do echo "tick $i"; sleep 1; done' \
> /tmp/ticks.log 2>&1 &
# 2) 查看作业和PID
jobs -l
# 3) 若需要脱离会话,忽略SIGHUP
disown -h %1
# 4) 验证进程仍存在
ps -ef | grep ticks | grep -v grep
建议:
- 临时后台运行:command & → jobs → fg/bg 调整。
- 断开终端仍运行:nohup command & 或 command & 后 disown -h。
- 避免输出阻塞:后台作业务必重定向标准输出与错误输出。
排错清单#
- 作业找不到:确认作业号(
jobs -l),作业可能已结束。 no job control:检查是否为交互式 shell,或set -m是否开启。- 终端关闭后退出:未使用
nohup或disown -h。
练习#
- 运行
ping 127.0.0.1,用Ctrl+Z挂起,再用bg恢复,最后用fg调回前台并Ctrl+C结束。 - 用
nohup启动一个每秒写日志的任务,断开终端后重连验证日志仍在追加。 - 启动后台任务并
disown -h,关闭终端后确认进程仍存在。