概念:作业(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 %1和fg 1是不同的(后者按 PID)