信号与 kill 的关系
kill 命令的名字容易误导:它真正做的事是给进程发信号,终止只是其中一种信号的效果。进程收到信号后可以自己决定怎么处理,所以优雅退出与强制终止的区别就在信号选择上。默认发送的终止信号让进程有机会保存状态、释放锁、刷盘并正常退出;强制终止信号则直接由内核结束进程,不给任何清理机会。理解这个差别,配合进程查找与判断手段,才能既停掉该停的东西又不制造脏数据。
基本信息
| 所属 | procps 提供的 kill、pkill、pgrep |
|---|---|
| 语法 | kill [-信号] 进程号;pkill [-信号] 匹配条件 |
| 默认信号 | 终止信号,允许进程做清理 |
| 强制信号 | 编号 9,内核直接结束进程,无清理机会 |
| 重载信号 | 编号 1,部分守护进程据此重读配置 |
| 适用平台 | Kylin V10 / UOS / openEuler 通用 |
典型使用场景
- 停掉卡死的进程:先发终止信号观察,确认无效后再考虑强制信号
- 被 systemd 托管的服务出问题时:改用 systemctl stop,让 systemd 按超时机制收尾
- 批量处理同类进程:按命令行特征匹配,一次停掉所有异常实例
- 让服务重读配置:支持重载信号的服务可据此生效新配置而不断连接
- 判断进程是否存活:用信号编号 0 探测,只看退出码不产生副作用
- 排障时锁定目标:先列出匹配清单再动手,避免误伤无关进程
常用信号与操作
常用信号与操作
kill -TERM 12345 # 优雅终止,优先使用
kill -HUP 12345 # 通知重载配置,需程序自身支持
kill -9 12345 # 强制终止,最后手段
pgrep -a -f myapp # 先列出匹配的进程与完整命令行
pkill -TERM -f '/opt/myapp/bin/myapp' # 按完整路径匹配后批量终止
kill -0 12345 && echo alive # 探测进程是否存在
systemctl stop myapp # systemd 托管服务的规范停法常用信号读法
| 信号 | 编号 | 作用与使用场景 |
|---|---|---|
| 终止 | 15 | 默认信号,允许进程清理后退出 |
| 强制终止 | 9 | 内核直接结束,可能有残留锁与临时文件 |
| 重载 | 1 | 常用于让守护进程重读配置 |
| 中断 | 2 | 相当于终端里的中断操作 |
| 查询 | 0 | 不发送信号,仅探测进程是否存在 |
强制终止之后,进程没有机会清理锁文件、临时文件和未落盘数据,数据库或消息队列类进程被强杀可能导致下次启动需要恢复。被 systemd 托管的进程尽量用 systemctl stop,由 systemd 按超时策略发送终止信号并在必要时升级强制终止。
按名称批量处理时,匹配条件要尽量精确到完整路径或唯一特征。只写一个通用的关键字会命中大量无关进程,后果往往比不做处理更严重。先用列出命令确认命中清单,是这类操作的标准前置动作。