kill PID默认发 SIGTERM,进程可以做清理后再退,首选方式。
约 1215 字大约 4 分钟
2026-05-14
kill 这个名字有误导性——它不是“杀死”,而是“给进程发一个信号”。信号是 Linux 里通知进程的标准机制:让它优雅退出、强制终止、重载配置,都是发不同的信号。理解信号,才能在“关不掉”和“别乱关”之间做对选择。
理解 kill 是“发信号”而非“杀死”,掌握 TERM、KILL、HUP、INT 等常见信号的区别和正确用法。
kill PID默认发 SIGTERM,进程可以做清理后再退,首选方式。
kill -9 PID发 SIGKILL,无法被捕获,最后手段,可能丢数据。
kill -HUP PID很多服务约定收到 SIGHUP 就重新读配置而不重启。
pkill -TERM nginx对名字匹配的所有进程发信号,注意别匹配太宽。
kill 1234 不是“销毁 1234”,而是“给 1234 发一个 SIGTERM 信号”。进程收到信号后怎么反应,取决于它自己——可以捕获处理、可以忽略、也可以用默认行为。kill -信号名 PID 就是指定发哪个信号。
| 信号 | 编号 | 进程能否捕获 | 用途 |
|---|---|---|---|
SIGTERM | 15 | 能 | 礼貌地请它退出,进程可以先保存数据、关连接。kill 默认就是它 |
SIGKILL | 9 | 不能 | 内核直接终结进程,不给任何清理机会,最后手段 |
SIGINT | 2 | 能 | 终端 Ctrl+C 发的就是它,相当于“中断” |
SIGHUP | 1 | 能 | 原意是“终端挂断”,现在很多服务约定它为“重载配置” |
SIGSTOP / SIGCONT | 19 / 18 | 不能 / —— | 暂停 / 恢复进程 |
正确的顺序是:
kill PID(发 TERM),给进程几秒钟做清理——刷新缓冲、写完文件、关闭数据库连接。kill -9 PID(发 KILL)强制终结。直接上 kill -9 的问题:进程没机会做任何收尾,可能留下损坏的文件、未释放的锁、不一致的数据。-9 是“砍断电源”,不是“关机”。只有当 TERM 无效时才用它,而且要明白可能付出数据代价。
如果一个进程连 kill -9 都杀不掉,多半是它处于 D(不可中断睡眠)状态,卡在内核 I/O 里——这种情况杀不动是正常的,要去解决底层的 I/O 问题。
很多守护进程(nginx、sshd 等)约定:收到 SIGHUP 就重新读取配置文件,但不中断正在处理的连接。这比 restart 温和得多。不过这只是约定,不是所有程序都支持——用之前先查该服务的文档。对 systemd 管理的服务,更推荐用 systemctl reload(见 服务生命周期),它内部就是按 unit 配置发对应信号。
kill -9 前先确认 PID,pkill 要收紧匹配
两个高频翻车点:① PID 会被系统复用,你几分钟前记下的 PID 现在可能是另一个进程,kill 前用 ps -p PID 再确认一次;② pkill nginx 会对所有名字含 nginx 的进程发信号,匹配太宽可能误杀,先用 pgrep -a nginx 看清命中列表再动手。生产环境尤其要先 TERM、留时间、再考虑 KILL。
| 误区 | 更稳妥的做法 |
|---|---|
关进程习惯性直接 kill -9 | 先发 TERM 给它清理机会,无效再用 KILL |
以为 kill -9 万能,杀不掉就反复试 | 杀不掉多半是 D 状态卡在 I/O,要解决底层问题 |
pkill 凭名字一把梭 | 先 pgrep -a 看命中列表,确认不误伤再发信号 |
| 对任意服务发 HUP 期望它重载 | HUP 重载只是约定,先确认服务支持,或用 systemctl reload |
版权归属:Shuo Liu