跳到主要内容

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

-9KILL 信号,进程无法捕获和清理。它很有效,但不优雅,可能导致临时文件、锁文件或数据状态没有清理。

注意

不要一上来就 kill -9。先用普通 kill,确认无效后再使用强制结束。

常见信号

信号编号常见含义
TERM15请求正常退出
KILL9强制结束
INT2中断,通常由 Ctrl+C 触发
HUP1挂起,很多服务用它重新加载配置
STOP19暂停进程
CONT18继续运行

不同系统上部分编号可能有差异,但 TERMKILLINT 是最常用的。

按名称结束进程

如果你知道进程名,可以使用 pkill

pkill nginx

但这会影响所有匹配进程。初学阶段更推荐先用:

ps aux | grep nginx

确认 PID 后再处理。

小结

你需要掌握:

  • 命令末尾加 & 可以后台运行。
  • jobs 查看当前 Shell 的作业。
  • fg 把作业带回前台。
  • bg 让暂停作业在后台继续。
  • Ctrl+C 中断,Ctrl+Z 暂停。
  • kill PID 优先于 kill -9 PID

这部分知识会直接帮助你排查卡住的命令和异常进程。