pgrep仅支持shell通配符而非完整正则,需结合ps与grep -E实现正则筛选;-f选项匹配完整命令行,但.∗等仍为glob模式;规避grep自匹配可用[p]ython或pgrep -f " python "。

pgrep 本身不支持完整正则表达式(如 .*、^、$),它只支持简单的 shell 通配符(*、?、[...])和部分扩展模式(取决于编译选项)。真正实现“正则筛选进程”的常用组合是 pgrep + ps + grep -E 或 ps aux | grep -E,而非仅靠 pgrep。
pgrep 的模式匹配能力有限但实用
pgrep 默认按进程名(comm 字段,通常为命令 basename)进行子串匹配。加上 -f 选项后,才匹配完整命令行(argv[0] 及其参数):
-
pgrep nginx→ 匹配进程名含 "nginx" 的进程(如nginx、nginx: master process) -
pgrep -f "python.*data.py"→ 匹配命令行中含 "python" 后跟任意字符再跟 "data.py" 的进程(注意:此处的.*是 shell 通配,不是正则;实际由 pgrep 内部按 glob 规则解释) -
pgrep -f "java.*-Dspring.profiles.active=prod"→ 可定位特定启动参数的 Java 进程
需要真正正则?用 ps + grep -E 更可靠
当需使用 ^、$、\b、分组或复杂逻辑时,应放弃纯 pgrep,改用:
-
ps aux | grep -E '^[^ ]+ +[0-9]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+.*node.*server\.js$'—— 过于冗长,不推荐 - 更清晰写法:
ps -eo pid,comm,args | grep -E 'node.*server\.js' | grep -v grep - 精准匹配进程名(非命令行):
ps -eo comm= | grep -E '^chrome$|^firefox$'(=去掉列头,^$确保整行匹配)
提升精度与避免误匹配的小技巧
常见陷阱是 grep python 会把自身 grep 进程也列出来。规避方式有:
- 用字符类绕过:
ps aux | grep '[p]ython'—— 方括号使 grep 进程的命令行为[p]ython,不匹配python - 用
pgrep -f配合空格限定:pgrep -f " python "(前后加空格,减少匹配到python3或ipython) - 结合
-o(只输出 PID)和xargs做后续操作:pgrep -f "redis-server" | xargs kill -9
替代方案:pidof 和 systemd-cgls(适用于特定场景)
若进程名明确且无空格,pidof 更快(但不支持模式);若运行在 systemd 下,可直接用:
systemctl --type=service --state=running | grep myapp-
systemd-cgls | grep -A5 -B5 "myapp"—— 查看 cgroup 中相关进程树










