Linux 信号与进程终止速查
常用命令
kill -l
kill -15 <pid>
kill -TERM <pid>
kill -9 <pid>
kill -HUP <pid>
kill -USR1 <pid>
kill -STOP <pid>
kill -CONT <pid>
kill -0 <pid> && echo alive
pkill -f 'java -jar app.jar'
pkill -TERM -u deploy java
killall -TERM nginx
ps -eo pid,ppid,stat,cmd | grep '[a]pp'
场景速查
| 目的 |
写法/命令 |
注意 |
| 优雅停止 |
kill -TERM <pid> |
应用需自行处理并退出 |
| 强制杀死 |
kill -KILL <pid> |
不可捕获,可能丢数据 |
| 重载配置 |
kill -HUP <pid> |
仅程序实现 HUP 处理时有效 |
| 暂停进程 |
kill -STOP <pid> |
进程不再被调度 |
| 恢复进程 |
kill -CONT <pid> |
与 STOP 配对使用 |
| 检查存活 |
kill -0 <pid> |
同时检查存在性与权限 |
| 按名字终止 |
pkill -x nginx |
-x 精确匹配进程名 |
| 按命令行终止 |
pkill -f 'pattern' |
先用 pgrep -af 核对 |
| 按用户终止 |
pkill -u deploy |
影响该用户全部进程 |
| 查看信号表 |
kill -l |
对照编号与名称 |
| 退出码 |
$? 为 128+n |
143=128+15,137=128+9 |
易错点
- 错误:上来就
kill -9;正确:先发 SIGTERM,等待超时后再 SIGKILL。
- 错误:把
kill <pid> 当成强制杀死;正确:默认信号是 SIGTERM(15)。
- 错误:用
pkill -f app 直接执行;正确:先 pgrep -af app 核对,避免误杀命令行含该模式的进程。
- 错误:认为
SIGKILL 能被应用捕获做清理;正确:KILL 不可捕获、不可忽略,清理要在外部完成。
- 错误:把
SIGHUP 当通用重载;正确:程序未注册 HUP 处理时会按默认动作退出。
- 错误:看到退出码 137 就断定 OOM;正确:137 只说明被 SIGKILL,可能来自 OOM、手动 kill 或编排系统。
- 错误:
SIGSTOP 后继续发信号等待处理;正确:进程暂停期间不调度,需 SIGCONT 恢复。
- 错误:直接对记录的 PID 操作;正确:PID 会复用,先用
ps -p <pid> -o cmd= 确认身份。
- 错误:在容器里用
kill -9 1 停服务;正确:用 docker stop 或 kubectl delete pod 从外部终止。
相关命令
读完自测
SIGTERM 与 SIGKILL 的核心区别是什么?
- 退出码 143 代表什么?
- 如何精确按进程名终止 nginx?
答案
SIGTERM 可被捕获并优雅退出,SIGKILL 不可捕获、立即终止。
- 进程被 15 号信号
SIGTERM 终止,即 128+15。
- 用
killall -TERM nginx 或 pkill -x nginx。