killall 通过精确匹配进程短名称(/proc/[pid]/comm)批量终止进程,速度快但易误杀;应先用 -v 或 -i 验证,多实例场景推荐 pkill -f,信号优先选 SIGTERM。

Linux 中用 killall 批量终止指定进程,核心是“按进程名精确匹配并发送信号”,不是模糊搜索也不是按命令行内容查找。它快、直接,但容易误杀——关键在理解它匹配的是什么、怎么验证、何时该换其他命令。
killall 匹配的是进程“短名称”,不是命令行
它只比对 /proc/[pid]/comm 文件里的内容,这个字段是内核分配的简短名字(不含路径、参数、空格)。比如运行:
-
python3 /var/www/app/main.py→comm是python3 -
nginx -c /etc/nginx/nginx.conf→comm是nginx -
java -jar myapp.jar→comm是java
所以 killall python3 会干掉所有叫 python3 的进程,不管它们在跑什么脚本。想确认当前有哪些短名,可运行:
ps -eo comm,args | head -10
安全操作:先看再杀,别跳过验证步骤
直接执行 killall xxx 风险高。务必分两步:
- 加
-v查看将杀哪些:killall -v nginx—— 逐行输出 PID 和进程名 - 加
-i开交互模式:killall -i firefox—— 每个进程都问你“kill 1234? (y/N)” - 加
-u限定用户:killall -u alice node—— 只杀 alice 用户的 node 进程,不碰别人
如果目标进程可能属于不同服务(比如多个 python3 实例跑着不同应用),仅靠 killall 无法区分,这时它就不适用了。
支持通配符?要看系统和版本,但不推荐依赖
部分新版 killall(如来自 psmisc 23.4+)支持 -r 选项启用正则匹配,例如:
killall -r '^chrome.*$'
但多数发行版默认不开启,且行为不稳定。更通用、可靠的做法是换用 pkill -f:
-
pkill -lf "gunicorn.*8001"—— 先预览匹配到的完整命令行 -
pkill -f "gunicorn.*8001"—— 再真正发送 SIGTERM -
pkill -9 -f "gunicorn.*8001"—— 无响应时再强制
注意:pkill -f 匹配的是 /proc/[pid]/cmdline,也就是你敲进去的整条命令,精度更高。
信号选择:优先发 SIGTERM,不是 -9
killall 默认发 SIGTERM(15号),这是设计用来优雅退出的信号。大多数正规程序(nginx、redis、gunicorn)都会响应它,完成清理后再退出。
- 用
killall nginx或killall -TERM nginx效果一样 - 只有确认进程卡死、没反应时,才补
killall -9 nginx - 避免一上来就
-9:可能丢数据库连接、未保存缓存、锁没释放
发完 TERM 后,可用 kill -0 PID 检查是否还活着(不发信号,只查状态),或等几秒再确认。











