Linux进程管理:kill、pkill、killall的区别与用法

Linux进程管理:kill、pkill、killall的区别与用法

你遇到了一个卡死的进程。CPU 100%,你按Ctrl+C没反应。你听说过kill -9,但不确定这会带来什么后果,也在犹豫是不是有更合适的做法。

进程管理是Linux运维的基本技能。今天把killpkillkillall讲清楚,让你知道什么时候用什么。

先看一个数据

在排查服务器问题时,进程管理是高频操作之一。但很多用户并不清楚kill -9kill -15的区别。直接使用kill -9强制终止进程,可能会导致数据丢失、文件锁未释放或资源残留。大部分情况下,应该优先尝试更优雅的终止方式。

kill:按PID精准杀进程

kill是最基础的进程管理命令,通过进程ID来发送信号。使用前你需要先用ps aux | grep 进程名pgrep找到进程的PID。

基本用法

bash

kill PID

默认发送TERM信号(-15),告诉进程“请你优雅地终止”,进程可以清理临时文件、释放资源、保存状态后再退出。

常用信号

信号编号信号名称用途
-1HUP让进程重新加载配置文件,不中断服务
-2INT相当于Ctrl+C,中断进程
-9KILL强制杀死进程,进程无法拦截或忽略
-15TERM优雅终止,进程可以清理资源后退出

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

特性pkillkillall
匹配方式子串匹配完整名称匹配
示例pkill nginx会匹配nginx和nginx-workerkillall 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出场。pkillkillall简化了批量操作,但它们使用的匹配规则不同,了解这些差异能帮你避免误杀。下次你准备用-9之前,问问自己:这个进程真的卡死了吗?有没有更优雅的方式?

知识库

宝塔面板常见问题与故障排查

2026-6-22 16:18:51

知识库

网站被篡改怎么办?首页被黑应急处理流程

2026-6-23 16:39:46

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧