返回首页

Linux kill 命令高阶实战指南

📅 创建于 2026-06-25 🔄 更新于 2026-06-25 📝 531 字

来源:小源 | 发布日期: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-guideLinux 运维命令完整速查(含 kill/pkill 基础用法)
linux-essential-commands-referenceLinux 必备命令速查
linux-process-state-diagnosisLinux 进程状态诊断与排障
online-troubleshooting-checklist线上排障通用检查清单