sigterm与sigkill本质区别在于是否允许进程自主响应:sigterm(15)可捕获、阻塞或忽略,支持优雅退出;sigkill(9)不可拦截,内核强制立即终止。

SIGTERM 和 SIGKILL 的核心区别在于:是否允许进程自主响应与清理。前者是“请退出”,后者是“立刻停止”,不是程度轻重之分,而是机制本质不同。
信号可否被拦截或忽略
SIGTERM(编号15)可以被进程捕获、阻塞或忽略。程序可通过 signal() 或 sigaction() 注册处理函数,在收到该信号后执行保存数据、关闭文件、断开连接等操作,再自行调用 exit() 退出。
SIGKILL(编号9)完全不可捕获、不可阻塞、不可忽略。内核直接终止进程及其所有线程,不经过用户态任何代码。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
实际行为差异
- SIGTERM 发送后,进程可能延迟退出——取决于它当前是否忙、是否在信号处理中、是否主动忽略
- SIGKILL 一发即收,毫秒级终止,但子进程不会自动被杀(除非属于同一进程组且显式发送),父进程若未及时 wait,可能留下僵尸进程
- 使用 SIGTERM 时,子进程的父进程会变为 init(PID 1),由系统托管回收;SIGKILL 不触发这一交接流程
典型使用场景
- 日常终止服务:如 kill 1234(等价于 kill -15 1234),Nginx reload、数据库停服都依赖它完成优雅关闭
- 进程无响应时兜底:仅当 kill 1234 无反应(如卡死在内核态、信号被阻塞未处理),才用 kill -9 1234
- 避免误用:脚本中写死 kill -9 容易导致日志丢失、事务中断、锁未释放等问题
如何验证信号是否生效
可用 strace -p PID 观察进程是否在处理 SIGTERM;用 ps -o pid,ppid,stat -p PID 查看状态(Z 表示僵尸,T 表示暂停,R/S 表示运行/休眠);若 kill 后进程仍存在且 stat 显示 R 或 S,说明 SIGTERM 未被处理,再考虑 SIGKILL。










