概念:作业(job)

在当前 shell 里启动的进程叫"作业"——可以前台或后台运行,可以暂停 / 恢复。

启动后台任务

sleep 100 &
# [1] 12345
# ↑   ↑
# 作业号 PID

jobs:看当前作业

jobs
# [1]+  Running    sleep 100 &

jobs -l             # 含 PID
# [1]+ 12345 Running    sleep 100 &

+ 表示"最近的",- 表示"次近的"。

fg:拉回前台

fg                  # 最近的作业
fg %1               # 1 号作业
fg %sleep           # 名字含 sleep 的

bg:放回后台

# 先 Ctrl+Z 暂停前台任务
sleep 100
# ^Z
# [1]+  Stopped    sleep 100

bg                  # 放后台继续跑
# [1]+ sleep 100 &

Ctrl+Z:暂停前台

sleep 1000
# 按 Ctrl+Z → 暂停
# [1]+  Stopped    sleep 1000

# 之后可以 fg / bg

典型场景:临时跳出 vim 做别的

vim file.txt
# 按 Ctrl+Z
# [1]+  Stopped    vim file.txt

# shell 里干活
ls
grep foo bar.txt

# 回 vim
fg

杀作业

kill %1             # 1 号作业
kill -9 %sleep

退出 shell 时

默认行为:

  • 后台跑着的作业 → shell 退出会被 SIGHUP 杀掉
  • 想让作业活下去:disown 把作业从 shell 列表里摘掉
long-task &
disown -h %1        # %1 永远不会收到 HUP
# 现在 exit 也没事

更彻底脱离:nohup(下一篇)。

  • Ctrl+Z暂停不是——任务还在内存里,资源不释放
  • 后台作业 stdout 仍然打到当前终端——会冲乱你的输入,最好重定向
  • fg %1fg 1 是不同的(后者按 PID)