做什么
向进程发送信号——不只是"杀",是"通讯"。
实战
kill 1234 # 默认发 SIGTERM(15,温柔结束)
kill -9 1234 # SIGKILL(强制,不可阻挡)
kill -HUP 1234 # SIGHUP(多数服务用来"重载配置")
kill -INT 1234 # SIGINT(同 Ctrl+C)
kill -STOP 1234 # 暂停(不能阻挡)
kill -CONT 1234 # 继续
kill -l # 看所有信号名 + 数字
常用信号速查
| 信号 | 数字 | 说明 |
|---|---|---|
SIGTERM |
15 | 默认——温柔结束,让程序自己清理 |
SIGKILL |
9 | 内核直接杀,不可阻挡 |
SIGHUP |
1 | 挂起 / 多数 daemon 重载配置 |
SIGINT |
2 | 中断(Ctrl+C) |
SIGQUIT |
3 | 退出 + core dump |
SIGSTOP |
19 | 暂停(不可阻挡) |
SIGCONT |
18 | 继续 |
SIGUSR1 |
10 | 用户自定义 1(应用层约定) |
SIGUSR2 |
12 | 用户自定义 2 |
永远先 TERM,再 KILL
kill 1234 # 先试温柔
sleep 5
kill -9 1234 # 不响应才强杀
kill -9不让程序清理资源——可能留下不一致状态(脏数据、未关闭的锁、临时文件等)。只在 TERM 不响应时用。
D 状态杀不掉
STAT = D(uninterruptible sleep)
进程在等磁盘 IO 时信号会被阻塞——kill -9 也没用。要等 IO 完成(或重启)。
给一组进程发信号
kill -- -<PGID> # 整个进程组(前面的负号关键)
或用 killall / pkill(下一篇)按名字批量。
通过其他工具发信号
killall nginx # 按命令名杀所有
pkill -f "myapp" # 按命令行匹配
坑
kill -1≠kill 1!前者发 SIGHUP,后者杀 PID 1(init 进程,会让系统挂)kill -0 PID检查进程是否存在(发 0 信号 = 探测)kill -9也杀不动的:- D 状态(IO 等待)
- 内核线程(PID 在
[]里的) - PID 1(init)