Linux 作业控制与信号:jobs、fg、bg、kill
在终端里运行命令时,你会遇到这些问题:
- 命令一直运行,怎么停下来?
- 程序暂停了,怎么恢复?
- 后台任务怎么查看?
- 如何优雅结束一个进程?
这些都和作业控制和信号有关。
前台任务和后台任务
前台任务会占用当前终端。比如:
sleep 60
运行期间,你不能在这个终端继续输入新命令,除非它结束或被中断。
如果想让命令在后台运行,可以在末尾加 &:
sleep 60 &
Shell 会显示作业编号和 PID,例如:
[1] 12345
jobs:查看后台作业
查看当前 Shell 的作业:
jobs
输出类似:
[1]+ Running sleep 60 &
注意,jobs 只显示当前 Shell 管理的作业,不是系统所有进程。查看系统进程要用 ps。
Ctrl+C:中断前台任务
如果前台命令不想继续运行,可以按 Ctrl+C。它会向前台进程发送中断信号。
例如运行:
ping 127.0.0.1
按 Ctrl+C 后,ping 会停止并显示统计信息。
Ctrl+Z:暂停前台任务
Ctrl+Z 会暂停当前前台任务:
sleep 300
按 Ctrl+Z 后可能看到:
[1]+ Stopped sleep 300
这时任务没有结束,只是暂停了。
bg:让暂停任务在后台继续
bg %1
%1 表示作业编号 1。你可以用 jobs 查看编号。
fg:把后台任务切回前台
fg %1
任务回到前台后,你可以继续等待,或按 Ctrl+C 中断它。
kill:向进程发送信号
kill 不只是“杀死进程”,更准确地说,它用于向进程发送信号。
优先尝试正常结束:
kill 12345
这默认发送 TERM 信号,请求进程退出。
如果进程没有响应,再考虑强制结束:
kill -9 12345
-9 是 KILL 信号,进程无法捕获和清理。它很有效,但不优雅,可能导致临时文件、锁文件或数据状态没有清理。
注意
不要一上来就 kill -9。先用普通 kill,确认无效后再使用强制结束。
常见信号
| 信号 | 编号 | 常见含义 |
|---|---|---|
TERM | 15 | 请求正常退出 |
KILL | 9 | 强制结束 |
INT | 2 | 中断,通常由 Ctrl+C 触发 |
HUP | 1 | 挂起,很多服务用它重新加载配置 |
STOP | 19 | 暂停进程 |
CONT | 18 | 继续运行 |
不同系统上部分编号可能有差异,但 TERM、KILL、INT 是最常用的。
按名称结束进程
如果你知道进程名,可以使用 pkill:
pkill nginx
但这会影响所有匹配进程。初学阶段更推荐先用:
ps aux | grep nginx
确认 PID 后再处理。
小结
你需要掌握:
- 命令末尾加
&可以后台运行。 jobs查看当前 Shell 的作业。fg把作业带回前台。bg让暂停作业在后台继续。- Ctrl+C 中断,Ctrl+Z 暂停。
kill PID优先于kill -9 PID。
这部分知识会直接帮助你排查卡住的命令和异常进程。