killall仅按/proc/[pid]/comm中的短名称精确匹配进程,不支持通配符或正则;需用pkill -f匹配完整命令行,操作前务必用-v/-l验证目标进程。

killall 不能靠名字模糊匹配来“批量结束相似进程”,它只按完整进程名精确终止——这是最常踩的坑。
killall 的进程名匹配规则很严格
killall 不支持通配符(如 nginx*)或正则,它只比对 /proc/[pid]/comm 文件内容,也就是内核给进程分配的「短名称」(通常不含路径、参数和空格)。比如 python3 /opt/app/main.py 的 comm 是 python3,不是 main.py。
- 运行
ps -eo comm,args | head -5可同时看短名和完整命令行,确认你要杀的是哪个字段 - 若想按参数过滤(如所有含
worker的 Python 进程),killall做不到,得换pkill -f -
killall -I(大写 i)可开启大小写敏感,但默认就是忽略大小写的,一般不用加
真正安全的批量终止:先用 -v 和 -w 验证再动手
直接 killall python3 可能干掉 IDE、终端里正在跑的脚本,甚至系统服务。必须分两步验证:
- 加
-v查看将要杀哪些进程:killall -v python3—— 它会逐行输出匹配到的 PID 和进程名 - 加
-w让命令等待直到所有目标进程退出(适合配合脚本做清理):killall -w -v node - 如果只想杀当前用户的进程,加
-u $USER,避免误杀别人或 root 的进程
替代方案:pkill -f 更适合按命令行内容批量操作
当你要杀的是「所有带 gunicorn 且监听 8001 端口的进程」这类场景,killall 完全无能为力,pkill 才是正解:
pkill -f "gunicorn.*8001"
-
-f表示匹配完整命令行(/proc/[pid]/cmdline),支持基本正则 - 务必先加
-l列出匹配到的 PID:pkill -lf "redis-server" - 注意 shell 字符转义:双引号内
.是字面量,.*才表示任意字符;写成'gunicorn.*8001'更稳妥
真正难的不是发 kill 命令,而是判断「哪些进程该被一起终结」——这取决于你的业务逻辑。比如 Web 应用的 worker 进程可能同名但归属不同服务,仅靠进程名无法区分。这时候得结合 pgrep -f + awk 提取启动目录或环境变量,再决定是否批量处理。










