pgrep -f 通过 shell glob 匹配完整命令行(/proc/[pid]/cmdline),非正则;易自匹配,可用 [p]ython 或 " python " 避免;精确定位需转义特殊字符、加用户限制或结合 -a/-n/-c 等选项。

pgrep -f 是定位带参数的进程最直接的方式,但它不是“正则搜索”,而是按 shell glob 规则匹配完整命令行(argv),用法稍有讲究,容易误匹配或漏匹配。
理解 -f 的实际行为
-f 会让 pgrep 去比对 /proc/[pid]/cmdline 中的完整启动命令(含路径和所有参数),但注意:
- 匹配模式仍走通配符逻辑(*、?、[a-z]),不是 grep -E 那类正则;例如
pgrep -f "python.*server.py"中的.*实际被当作文本.和*处理,不是“任意字符”含义 - 空格是分隔符,不是通配符;想匹配带空格的参数,得把整个片段写全,比如
"-c 'echo hello'" - 容易自匹配:运行
pgrep -f python时,pgrep 自己的命令行里含python(如果从 Python 脚本调用),就会被列出来
避免自匹配的实用写法
常用技巧是“字符拆分”或加空格锚定,让 pgrep 进程自身不满足条件:
- 用
[p]ython替代python:shell 展开后是字面量python,但 pgrep 命令行里实际是[p]ython,不匹配 - 用空格包围关键词:
pgrep -f " python "(前后带空格)——适用于参数中明确含独立单词的场景,如/usr/bin/python3 /opt/app/main.py - 组合 -x 不适用,因为 -x 只作用于进程名(comm 字段),和 -f 冲突,不能共用
精确定位带参数的服务进程
例如要找监听 8080 端口的 Java Web 应用,启动命令类似:java -jar app.jar --server.port=8080
- 安全写法:
pgrep -f "app\.jar.*--server\.port=8080"(点号加反斜杠防通配,* 表示中间可能有其他 JVM 参数) - 更稳一点可加用户限制:
pgrep -u appuser -f "app.jar",缩小干扰范围 - 若需确认完整命令行,立刻接
-a:pgrep -a -f "app.jar",一眼看到实际参数
配合管理动作快速收尾
查到 PID 后常需 kill 或检查资源,建议链式使用:
- 只杀最新一个匹配进程:
kill "$(pgrep -n -f 'redis-server --port 6380')" - 统计数量用于判断是否存活:
if [ $(pgrep -c -f 'nginx -c /etc/nginx-alt.conf') -eq 0 ]; then echo "配置 nginx 未运行"; fi - 与 lsof 联动查端口归属:
lsof -i :3000 -a -p $(pgrep -f 'node server.js')


















