4.2.2 常用作业控制命令:jobs、bg、fg、nohup、disown

作业控制命令用于在同一终端会话中管理前台/后台作业的运行状态,适用于长任务、临时离开终端或批量管理进程的场景。本节聚焦 jobs、bg、fg、nohup、disown 的核心用法、交互关系与常见注意事项,并给出可执行示例、排错与练习。

文章图片

jobs:查看当前会话作业#

  • 作用:列出当前 shell 会话中的后台作业与状态。
  • 常用格式:jobsjobs -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 %1fg(默认最近作业)。
  • 场景:需要交互操作或查看实时输出时使用。

命令说明与示例:

# 先准备一个后台作业
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 %1disown -a(移除所有)、disown -h %1(仅忽略 SIGHUP)。
  • 区别点:与 nohup 不同,disown 不改变信号处理方式,需结合 -h 或先用 nohup 启动。

命令说明与示例:

# 启动后台作业
sleep 1000 &
jobs -l

# 将其从作业表移除
disown %1

# 再次查看作业表为空
jobs

预期效果:
- jobs 不再显示该进程,但进程仍存在。

排错:
- disown: no such job:作业号错误或已完成。
- 终端关闭后进程退出:使用 disown -hnohup

常见组合与建议#

完整可执行流程示例:

# 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 &jobsfg/bg 调整。
- 断开终端仍运行:nohup command &command &disown -h
- 避免输出阻塞:后台作业务必重定向标准输出与错误输出。

排错清单#

  • 作业找不到:确认作业号(jobs -l),作业可能已结束。
  • no job control:检查是否为交互式 shell,或 set -m 是否开启。
  • 终端关闭后退出:未使用 nohupdisown -h

练习#

  1. 运行 ping 127.0.0.1,用 Ctrl+Z 挂起,再用 bg 恢复,最后用 fg 调回前台并 Ctrl+C 结束。
  2. nohup 启动一个每秒写日志的任务,断开终端后重连验证日志仍在追加。
  3. 启动后台任务并 disown -h,关闭终端后确认进程仍存在。