作业控制是什么
作业控制是交互式 shell 的能力:把命令放到后台运行、用挂起快捷键把前台作业暂停、再用前后台切换命令恢复执行。理解它的关键在于退出终端时会向未脱离的后台作业发送挂断信号,这正是 nohup 与 setsid 存在的理由。
基本信息
| 用途 | 当前 shell 会话内的作业切换与管理 |
|---|---|
| 语法 | 命令加与号放后台、列出作业、前后台切换、按作业号发信号 |
| 快捷键 | 挂起前台作业为停止状态 |
| 适用范围 | 仅交互式 shell,脚本默认不启用 |
典型使用场景
- 误启长任务:发现命令要跑很久时先挂起,再切到后台继续
- 临时并行:把耗时任务放后台,前台继续做别的事
- 查看会话内作业:列出当前会话的作业与状态
- 停止作业:按作业号发送信号,不用手工查进程号
- 脱离挂断信号:把作业从作业表移除,退出终端时不被终止
常用示例
常用示例
sleep 300 & # 放到后台运行
jobs -l # 查看作业号与进程号
fg %1 # 把作业拉回前台
# 运行中按挂起快捷键暂停,然后:
bg %1 # 让挂起的作业在后台继续
kill %1 # 按作业号发送终止信号
disown -h %1 # 从作业表移除,退出终端时不再收挂断信号操作对照
| 写法 | 作用 | 注意 |
|---|---|---|
| 命令加与号 | 后台运行 | 输出仍打到终端,建议重定向 |
| 挂起快捷键 | 暂停前台作业 | 作业状态变为已停止 |
| jobs -l | 列出作业与进程号 | 带进程号便于配合 ps 查看 |
| fg %n | 拉到前台 | 前台同时只能有一个作业 |
| bg %n | 后台继续 | 对已停止的作业生效 |
| disown | 从作业表移除 | 退出终端时不再受挂断信号影响 |
退出终端会向未脱离的后台作业发送挂断信号,这就是需要 nohup 或 setsid 的原因。
作业号随作业增删而变化,脚本里不要依赖它,直接管理进程号更可靠。
非交互脚本默认不启动作业控制,后台任务要用等待命令处理进程号,别指望交互式的那套语义。