
你遇到了一个卡死的进程。CPU 100%,你按Ctrl+C没反应。你听说过kill -9,但不确定这会带来什么后果,也在犹豫是不是有更合适的做法。
进程管理是Linux运维的基本技能。今天把kill、pkill、killall讲清楚,让你知道什么时候用什么。
先看一个数据
在排查服务器问题时,进程管理是高频操作之一。但很多用户并不清楚kill -9和kill -15的区别。直接使用kill -9强制终止进程,可能会导致数据丢失、文件锁未释放或资源残留。大部分情况下,应该优先尝试更优雅的终止方式。
kill:按PID精准杀进程
kill是最基础的进程管理命令,通过进程ID来发送信号。使用前你需要先用ps aux | grep 进程名或pgrep找到进程的PID。
基本用法:
bash
kill PID
默认发送TERM信号(-15),告诉进程“请你优雅地终止”,进程可以清理临时文件、释放资源、保存状态后再退出。
常用信号:
| 信号编号 | 信号名称 | 用途 |
|---|---|---|
| -1 | HUP | 让进程重新加载配置文件,不中断服务 |
| -2 | INT | 相当于Ctrl+C,中断进程 |
| -9 | KILL | 强制杀死进程,进程无法拦截或忽略 |
| -15 | TERM | 优雅终止,进程可以清理资源后退出 |
kill -9为什么让人又爱又恨
kill -9直接通知内核强制终止进程,进程没有机会做任何清理工作。打开的临时文件可能残留,网络端口可能没有释放,数据库事务可能被中断。优先使用默认的kill(也就是kill -15),进程卡死时再用kill -9。
pkill:按进程名批量杀
pkill不需要PID,直接通过进程名匹配,适合批量操作或你不知道PID的场景。
基本用法:
bash
pkill nginx # 杀掉所有名为nginx的进程 pkill -f "python3 /path/to/script.py" # 匹配完整命令行,杀指定脚本
常用参数:
bash
pkill -u www-data nginx # 只杀www-data用户启动的nginx进程 pkill -t pts/0 # 踢出在pts/0终端登录的用户 pkill -n php-fpm # 只杀最新启动的进程 pkill -o php-fpm # 只杀最早启动的进程
pkill和kill的区别:
kill:需要PID,精准,适合单个进程pkill:需要进程名,批量,适合按名称操作
killall:按完整进程名精确匹配
killall匹配的是完整的进程名,而pkill匹配的是进程名的任何部分(子串匹配)。
bash
killall nginx # 只杀完整名称为nginx的进程,不杀nginx-worker killall -u www-data # 杀死www-data用户的所有进程
pkill vs killall:
| 特性 | pkill | killall |
|---|---|---|
| 匹配方式 | 子串匹配 | 完整名称匹配 |
| 示例 | pkill nginx会匹配nginx和nginx-worker | killall nginx只匹配名为nginx的进程 |
| 灵活性 | 更灵活 | 更精确 |
实战场景
场景一:杀掉卡死的进程
bash
# 先用top找到高CPU的进程,或用ps定位 ps aux | grep "卡住的进程" kill -15 PID # 等几秒,如果还在,用-9 kill -9 PID
-15是默认信号,进程有1-2秒的机会清理。如果30秒后进程还没退出,再用-9。
场景二:重载Nginx配置
bash
# 不中断服务,重载配置文件 kill -1 $(cat /var/run/nginx.pid)
kill -1让Nginx重新读取配置文件并重载,进程不中断。相当于nginx -s reload。
场景三:清理所有php-fpm进程
bash
pkill php-fpm
有时候进程池卡住,重启所有PHP进程能恢复。
场景四:踢出某个用户
bash
pkill -u username # 或 killall -u username
注意:这会杀掉该用户的所有进程,包括正在运行的作业,确认后再执行。
真实案例:为什么kill -9不总是对的
一台MySQL服务器半夜CPU飙升。运维直接kill -9 $(cat /var/run/mysqld.pid),MySQL进程被强制终止,但InnoDB还没来得及将缓冲池中的脏页写入磁盘,也没有正常关闭日志文件。重启后MySQL自动进入崩溃恢复,扫描了整整2小时才重新上线,业务损失惨重。
如果当时用kill -15,MySQL会正常关闭,不会有长时间恢复的问题。只有进程彻底卡死时,才应该用-9。
最后一句
kill不是“杀死进程”,是“向进程发送信号”。默认信号是-15,这是给进程一个“体面退出”的机会。只有进程不响应时,才轮到-9出场。pkill和killall简化了批量操作,但它们使用的匹配规则不同,了解这些差异能帮你避免误杀。下次你准备用-9之前,问问自己:这个进程真的卡死了吗?有没有更优雅的方式?




