首页/系统/Linux 运维命令速查/pgrep 按条件找进程
进程与作业69 条

pgrep 按条件找进程

按名称/命令行/用户查 PID,替代 ps | grep 组合;-f 匹配完整命令行、-a 同时显示命令、-u 按用户。

Linux 运维命令速查系统更新于 2026-10-13

pgrep 是什么

pgrep 按条件查找进程并输出 PID:默认匹配进程名,-f 匹配完整命令行,-u 限定用户,-x 要求精确匹配,-a 顺带打印命令行。它是 ps aux | grep 组合的替代品,好处是不受 grep 自身进程干扰(不需要再写 grep -v grep),退出码语义也清晰:找到返回 0,没找到返回 1。脚本里可以先拿到 PID 列表再逐个处理,比拼接脆弱的文本管道可靠。需要注意默认匹配的是内核记录的 comm,长度上限 15 个字符。

基本信息

适用平台Linux(procps-ng 的 pgrep 与 pkill)
命令语法pgrep [选项] 模式
常用选项-f 匹配完整命令行 -a 显示命令行 -u 限定用户 -x 精确匹配 -l 显示进程名 -c 只输出数量 -n 取最新
退出码语义0 找到匹配,1 没有匹配,2 参数或语法错误
权限说明普通用户只能看到自己的进程,跨用户查询需要 root

典型使用场景

  • 运行检查:脚本里判断某服务是否在运行,直接看退出码
  • 批量操作:取到 PID 列表后交给 kill 或 top 处理
  • 按用户梳理:列出某个服务账号下的全部进程
  • 长命令行匹配:用 -f 匹配带参数的进程,如 python 脚本
  • 数量统计:用 -c 统计同类进程数量,判断是否需要扩容或限制

常用示例

常用示例
pgrep -a nginx                     # 列出进程与命令行
pgrep -c nginx                     # 只输出数量
pgrep -u www-data -a | head        # 指定用户的进程
pgrep -f 'python.*worker'          # 匹配完整命令行
pgrep -x sshd                      # 精确匹配进程名
pgrep -n -f 'java.*myapp'          # 只取最新启动的那一个
pkill -f 'python.*worker'          # 配套的批量终止命令

与 ps 加 grep 的差异

维度pgrepps aux 加 grep
自身干扰不会命中自己常需要追加 grep -v grep
结果判断退出码 0 与 1 语义明确需要另外判断输出是否为空
匹配对象默认进程名,-f 匹配完整命令行匹配整行文本,包含用户与时间等列
过滤条件提供用户、精确名、最新最旧等结构化条件只能靠正则与文本过滤拼凑
进程名匹配的是内核的 comm 字段,最长 15 个字符,更长的名字会被截断。名字较长的进程应当用 -f 匹配命令行,否则会匹配失败。
拿到 PID 后加以操作前要复核进程身份:PID 会被回收复用,先前的 PID 可能在稍后属于另一个进程。稳妥做法是同时核对命令名或启动时间。

易错点

  • 只用进程名匹配,遇到长名进程被截断导致匹配失败,应改用 -f
  • -f 匹配范围过大,命中参数中含相同字符串的无关进程
  • 把退出码 1 当成执行错误,脚本在服务未运行时走了异常分支
  • 把 PID 存起来延迟使用,期间进程退出且 PID 被新进程复用,操作对象错误

数据来源与参考

  • man 1 pgrep(procps-ng 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌