pkill -f 用于匹配完整命令行(含参数),而非仅进程名;不加 -f 时默认只匹配 /proc/[pid]/comm 字段,易漏杀或误杀。

pkill -f 是最直接有效的选择,但必须加 -f 才能匹配完整命令行;不加则只匹配进程名,容易漏杀。
为什么 pkill python 经常不生效?
默认情况下 pkill 只匹配 comm 字段(即进程的“basename”,如 python),不看启动参数。比如你运行的是 python3 server.py,实际进程名是 python3,但 pkill python 匹配不到 —— 因为 python ≠ python3。
- 真正想杀的是“跑着
server.py的 Python 进程”,就得用pkill -f "server.py" -
-f让pkill检查/proc/PID/cmdline,也就是完整启动命令 - 注意:匹配内容会被当作正则处理,特殊字符如
.、*、[需要转义或用单引号包裹,例如pkill -f 'my\.app\.py'
pgrep -f 配合 kill 更安全可控
比起一步到位的 pkill,先用 pgrep -f 查 PID 再手动 kill,能避免误杀、便于确认。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 先预览:
pgrep -f "django.runserver" | xargs ps -o pid,ppid,cmd -p - 再执行:
kill $(pgrep -f "django.runserver") - 若需强制终止:
kill -9 $(pgrep -f "django.runserver") - 加空值保护(防止没匹配到时执行
kill报错):pids=$(pgrep -f "django.runserver"); [ -n "$pids" ] && kill $pids
别用 ps | grep | awk | xargs kill 管道链硬刚
这类写法看似灵活,实则脆弱:列宽变化、PID 位置偏移、grep 自身进程干扰、空格/换行符未处理,都可能导致杀错或失败。
-
ps aux | grep "node app.js"很可能把grep node app.js这行也当成目标进程 - 用
grep "[n]ode app.js"能绕过自身,但可读性差、易出错 -
cut -c 9-15依赖固定列宽,不同系统或终端宽度下会截错 PID - 现代 Linux 上
pgrep/pkill已足够健壮,没必要退回到手工解析ps输出
killall 和 pkill 的关键区别在哪?
killall 默认按进程名(comm)精确匹配,且区分大小写;pkill 默认也是按进程名,但支持更灵活的模式匹配(如通配符、用户过滤),且 -f 是它独有的能力。
-
killall python3→ 杀所有comm == "python3"的进程 -
pkill python→ 杀所有comm以python开头的进程(等价于pkill '^python') -
pkill -u alice -f "worker.py"→ 只杀用户alice下命令行含worker.py的进程,killall不支持这种组合条件 -
killall在某些发行版(如 Alpine)默认不带,而pgrep/pkill几乎全平台预装
真正容易被忽略的是信号语义:kill 默认发 SIGTERM(可被捕获、允许优雅退出),kill -9 或 pkill -9 发 SIGKILL(无法捕获、立刻终止)。多数场景应先试 TERM,仅当进程无响应时才升级到 KILL。

















