来源:小源 | 发布日期:2026-06-19
概述
kill 不是杀进程命令,而是给进程发信号的工具。90% 的运维只会 kill -9,但线上无脑硬杀可能导致 binlog 日志断裂、文件锁残留、服务重启失败等严重后果。核心原则:普通关闭用默认 kill,卡死再补 -9。
5 个高频信号
| 信号编号 | 实际用途 | 使用场景 |
|---|---|---|
| 15 (SIGTERM) | 优雅关闭 | 绝大多数关闭进程场景,等待进程自行收尾、释放连接、落盘数据 |
| 9 (SIGKILL) | 强制硬杀 | 进程僵死、D 态、无视 15 信号时兜底使用,非必要不用 |
| 1 (SIGHUP) | 重载配置 | nginx、redis、Java 热加载配置,无需重启进程 |
| 19 (SIGSTOP) | 暂停进程 | 进程 CPU 占用过高时暂时冻结,不删除进程 |
| 18 (SIGCONT) | 恢复进程 | 解冻暂停的进程,恢复运行 |
线上 kill 标准流程:
kill <pid> # 默认 SIGTERM(15)
sleep 3 # 等待进程自行收尾
ps -p <pid> # 核查进程是否退出
# 没退出再补 -9(兜底)
kill -9 <pid>
永远不要一步到位 -9。硬杀的真实隐患:进程来不及刷内存数据到磁盘、不会关闭 socket 连接、子进程变成孤儿进程,后续极易出现端口占用、文件损坏。
3 个冷门高频实战用法
kill -0:零风险检测进程存活
kill -0 不会对进程做任何操作,只校验 PID 是否存在,无任何副作用,线上巡检脚本必用。
kill -0 <pid>
# 查看返回值
echo $? # 0=存在 1=不存在
可直接嵌入进程保活脚本:
#!/bin/bash
# 检测 nginx 主进程是否存活,挂了自动重启
master_pid=$(pgrep -f "nginx: master process")
echo "当前nginx主进程PID:$master_pid"
if [ -z "$master_pid" ]; then
echo "主进程不存在,准备重启nginx"
systemctl restart nginx
elif ! kill -0 "$master_pid" &>/dev/null; then
echo "PID无效/僵尸进程,重启nginx"
systemctl restart nginx
else
echo "nginx进程正常,无需操作"
fi
kill -19 / -18:进程临时暂停/恢复
定时任务(数据同步、数据库备份等)在白天运行时 CPU 占用过高影响业务,但又不想终止(重跑耗时极长),可先暂停、低峰期再恢复:
# 暂停进程,释放 CPU 资源,进程保留在内存
kill -19 <PID>
# 业务低峰期恢复继续执行
kill -18 <PID>
进程暂停后查看状态:
ps -eo pid,stat,cmd | grep nginx
进程状态含义:
| 状态 | 含义 |
|---|---|
| T | 被 kill -19 (SIGSTOP) 或 Ctrl+Z (SIGTSTP) 暂停,完全不调度 |
| t | 被 gdb 调试断点暂停(跟踪停止) |
| S | 正常休眠(如 nginx worker 默认状态) |
大写为主状态,小写为附加标记。常用于现场调试卡死进程——冻结后查看堆栈、日志,无需重启进程。
kill -1:热重载配置,零停机
替代 systemctl restart,避免连接断开。最常用于 nginx、redis、tomcat。
#!/bin/bash
# 1. 精准提取 nginx master 主进程 PID
pid=$(ps -ef | grep "nginx: master process" | grep -v grep | awk '{print $2}')
# 2. 判断主进程是否存在,存在才执行重载
if [ -n "$pid" ]; then
echo "检测到nginx主进程PID: $pid,执行热重载"
kill -1 "$pid"
else
echo "nginx主进程不存在,无需重载"
fi
验证重载效果:
ps -ef | grep nginx
# 执行热重载
kill -1 7528
ps -ef | grep nginx
热重载后 master 的 PID 不变,但 worker 进程会交替变化。对比 systemctl restart nginx:restart 会短暂断开连接,kill -1 实现无损更新。
批量杀进程实战
线上最头疼的不是单进程,是父子进程残留——单独杀主进程后子进程变成孤儿进程继续占用端口。
1. killall / pkill(快速排障首选)
不用查 PID,直接用进程名操作:
# 优雅关闭所有 nginx 进程
killall nginx
# 强制杀掉所有 python 爬虫进程
killall -9 python
# 只杀 root 用户的 java 进程,避免误杀
pkill -u root java
# 正则匹配,杀掉所有 test 开头的进程
pkill ^test
区别: killall 严格匹配进程全名,pkill 支持正则匹配和用户筛选,灵活性更高。
2. 管道批量杀(自定义匹配)
适合没有统一进程名的自定义程序,通过关键字匹配:
# 优雅杀掉所有包含 test_app 的进程
ps -ef | grep test_app | grep -v grep | awk '{print $2}' | xargs kill
grep -v grep过滤自身查询进程,避免误杀。
3. 进程组清理(彻底清理父子进程)
针对多进程服务(Python 多进程、Java 多实例),普通杀进程会残留子进程,用进程组一键清空:
# 查看进程组 ID (PGID)
ps -xaj
# 负号代表进程组,清理该组所有父子进程
kill -15 -<PGID>
避坑指南
- D(不可中断)和 Z(僵尸)状态进程:只能重启服务器,
kill -9无效,不要反复尝试。 - 严禁
kill -9 1:PID 1 是 systemd 根进程,强行杀死直接导致服务器宕机。 - 数据库、消息队列进程禁止直接 -9:极易导致数据偏移、事务回滚失败。
- 批量查杀前先核对再执行:去掉
xargs kill,只打印 PID 确认无误后再执行。
总结
| 场景 | 命令 | 说明 |
|---|---|---|
| 普通关闭 | kill <pid> |
默认 SIGTERM(15),等待进程自行收尾 |
| 卡死强杀 | kill -9 <pid> |
兜底使用 |
| 重载配置 | kill -1 <pid> |
零停机热加载 |
| 进程保活检测 | kill -0 <pid> |
零风险校验 PID 存在性 |
| 批量清理 | pkill <name> |
优先使用,父子残留用进程组 |
四句口诀:
- 普通关闭用默认 kill,卡死再补 -9
- 改配置重载用 kill -1
- 进程保活检测用 kill -0
- 批量清理优先 pkill,父子残留用进程组
关联页面
| 页面 | 关联点 |
|---|---|
| linux-ops-command-complete-guide | Linux 运维命令完整速查(含 kill/pkill 基础用法) |
| linux-essential-commands-reference | Linux 必备命令速查 |
| linux-process-state-diagnosis | Linux 进程状态诊断与排障 |
| online-troubleshooting-checklist | 线上排障通用检查清单 |