Linux中使用pgrep按进程名称查找PID的方法详解
pgrep命令直接按名称返回进程PID,避免psaux|grep的自身干扰。支持-f匹配完整命令行、-u按用户筛选、-c统计数量、-l显示进程名等参数,与pkill配合可管理进程,通过读取 proc实现,且不产生额外进程,效率高,是系统管理和脚本自动化首选。
在 Linux 线上问题排查中,最常见的操作之一就是——“快速找到某个进程的 PID”。很多人第一反应是使用 ps aux | grep xxx,但这种查找进程 PID 的方式有个典型问题:grep 自己也会出现在结果里,影响判断。
$ ps aux | grep nginx root 1234 0.1 0.3 54200 3120 ? Ss 10:00 0:00 nginx: master process www-data 1235 0.0 0.2 54600 2840 ? S 10:00 0:00 nginx: worker process user 5678 0.0 0.0 11268 960 pts/0 S+ 10:05 0:00 grep --color=auto nginx
最后一行 grep nginx 就是典型的无效噪音。虽然也能通过 ps aux | grep nginx | grep -v grep 再过滤一次,但写法繁琐、可读性也一般。而 pgrep 正是为“按名称查找进程 PID”这个需求设计的——它会直接返回匹配到的 PID,结果更清晰,使用也更高效。

为什么需要 pgrep?
回到最常见的运维场景:你需要先找到某个进程的 PID,然后再继续操作——比如查看资源占用、发送信号、统计进程数量,或者结合脚本做自动化处理。使用 ps aux | grep 时,结果里往往会混入 grep 自身的进程,还要额外手动过滤。而 pgrep 专门用于查找 Linux 进程,默认输出就是纯 PID,一行一个,既适合人工查看,也方便直接传递给其他命令。
基本用法
# 查找 nginx 的所有 PID $ pgrep nginx 1234 1235
输出结果非常简洁,只有进程 PID,一行一个。这种形式天然适合 Shell 脚本和命令行组合使用:
# 杀死所有 nginx 进程 $ pgrep nginx | xargs kill # 查看某个进程的详细信息 $ ps -p $(pgrep -o nginx) -f
核心参数详解
-f:匹配完整命令行
默认情况下,pgrep 只匹配进程名的前 15 个字符(这是 Linux 内核层面的限制)。如果你的 Python 脚本名称较长,默认方式就可能匹配不到:
# 默认只匹配进程名,可能匹配不到 $ pgrep my_long_python_script # 没输出 # -f 匹配完整命令行 $ pgrep -f "my_long_python_script" 12345
这个参数在实际工作里使用频率很高,因为很多时候我们真正想匹配的是完整启动命令或命令行参数,而不仅仅是进程名本身:
# 查找所有运行 python app.py 的进程 $ pgrep -f "python app.py" 12345 12346 # 查找监听 8080 端口的 ja va 进程 $ pgrep -f "ja va.*8080" 56789
-u:按用户筛选
在多用户 Linux 服务器环境中,按用户过滤进程非常实用,尤其适合排查特定账号下的服务:
# 查找 www-data 用户的所有进程 $ pgrep -u www-data 1234 1235 1236 # 组合使用:查找 root 用户的 nginx 进程 $ pgrep -u root nginx 1234 # 排除某个用户:查找非 root 的所有 node 进程 $ pgrep -u root -v node 23456 23457
-v 表示反向匹配,作用类似 grep 的 -v,可以灵活排除不需要的结果。
-l 和 -a:显示进程信息
默认情况下,pgrep 只输出 PID,虽然简洁,但有时不够直观:
# -l 显示 PID 和进程名 $ pgrep -l nginx 1234 nginx 1235 nginx # -a 显示 PID 和完整命令行 $ pgrep -a node 12345 node /app/server.js 12346 node /app/worker.js
在调试和故障排查时,-a 尤其方便,可以直接看到每个进程正在执行什么命令,连启动参数也能一并确认。
-n 和 -o:最新和最旧
当一个服务同时存在多个进程时,你可能只想获取其中某一个,比如最新启动的或最早启动的进程:
# 只获取最新的 node 进程(最后启动的) $ pgrep -n node 12346 # 只获取最旧的 node 进程(最先启动的) $ pgrep -o node 12345
这个参数组合在服务重启、灰度替换或逐个处理进程时非常实用——比如先停止旧进程,再拉起新实例:
# 重启 node 服务 $ kill $(pgrep -o node) && npm start
-c:统计匹配数量
有时候你并不关心具体 PID,只想快速知道某类进程当前有多少个在运行:
# nginx 跑了几个 worker? $ pgrep -c nginx 3 # 某个用户跑了多少个 node 进程? $ pgrep -u deploy -c node 5
-P:按父进程查找
如果你要查看某个父进程下面挂了哪些子进程,可以直接使用这个参数:
# 找到 PID 为 1234 的所有子进程 $ pgrep -P 1234 1235 1236 1237
这在分析进程树、排查 master-worker 模型服务时特别有帮助,比如确认某个主进程下面到底启动了多少工作进程。
-x:精确匹配
默认情况下,pgrep 使用正则模糊匹配,因此 pgrep ssh 可能会同时匹配 sshd 和 ssh-agent:
# 模糊匹配(默认) $ pgrep ssh 1234 # sshd 1235 # ssh-agent # 精确匹配 $ pgrep -x sshd 1234
-d:自定义分隔符
默认输出是按换行分隔的,但在某些命令拼接场景下,你也可以改成逗号、空格等其他分隔符:
# 逗号分隔,方便传给其他命令 $ pgrep -d, nginx 1234,1235,1236 # 空格分隔 $ pgrep -d' ' nginx 1234 1235 1236
pgrep 与 pkill 的配合
pkill 可以看作是 pgrep 的“兄弟命令”,两者参数和使用思路几乎一致,不同点在于 pkill 会直接向匹配到的进程发送信号:
# 优雅重启 nginx $ pkill -HUP nginx # 杀死所有 node 进程 $ pkill node # 杀死某个用户的所有进程(慎用!) $ pkill -u username
在日常运维和进程管理中,常见做法是先用 pgrep 查,再用 pkill 处理,形成一套完整流程。如果想先确认再执行,建议先运行 pgrep -a 查看具体匹配到了哪些进程,确认无误后再使用 pkill。
pgrep 底层原理
pgrep 的实现原理并不复杂,本质上是直接读取 Linux 的 /proc 文件系统,遍历 /proc/[pid]/ 目录中的进程信息:
# pgrep 本质上就是在遍历这些目录 $ ls /proc | grep -E '^[0-9]+$' 1 10 123 124 ...
每个进程目录下通常都包含 comm(进程名)和 cmdline(完整命令行)等关键文件:
# 查看进程名 $ cat /proc/1234/comm nginx # 查看完整命令行 $ cat /proc/1234/cmdline | tr ' ' ' ' nginx: master process /usr/sbin/nginx -g daemon on;
pgrep 的 -f 参数实际上就是去读取 cmdline,而默认模式读取的是 comm。这也解释了为什么 -f 往往会稍慢一些——因为需要读取和匹配的数据更多。理解这一点后,你就更容易判断什么时候该用 -f,什么时候默认匹配就已经足够。
实战脚本示例
1. 检查服务是否运行
#!/bin/bash
# check_service.sh
SERVICE=$1
if pgrep -x "$SERVICE" > /dev/null; then
echo "$SERVICE is running (PID: $(pgrep -o $SERVICE))"
else
echo "$SERVICE is not running"
exit 1
fi
2. 批量重启所有 node 进程
#!/bin/bash
# restart_all_node.sh
PIDS=$(pgrep -f "node.*app")
if [ -z "$PIDS" ]; then
echo "No node app processes found"
exit 0
fi
echo "Found node processes: $PIDS"
echo "$PIDS" | xargs kill
sleep 2
npm start
echo "Restarted"
3. 监控进程数量告警
#!/bin/bash
# monitor_workers.sh
MAX_WORKERS=10
COUNT=$(pgrep -c -f "python worker")
if [ "$COUNT" -gt "$MAX_WORKERS" ]; then
echo "WARNING: Too many workers ($COUNT > $MAX_WORKERS)"
# 发送告警
fi
小结
相比 ps aux | grep 这种传统组合命令,pgrep 在 Linux 查找进程 PID 时更简洁、更准确,也更适合写入 Shell 脚本或自动化运维流程。几个最常用的场景包括:
- 快速查 PID:
pgrep nginx - 查看完整命令:
pgrep -af node - 统计进程数:
pgrep -c -f "python worker" - 按用户过滤:
pgrep -u www-data -l
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
用 pytest-benchmark 建立可复现的性能基线:从对比到回归
本文介绍如何利用 pytest-benchmark 为 Python 代码建立可重复的性能基准,通过基准测试、对比分析和结果验证定位性能差异,同时避免测试环境、数据规模和统计方式带来的误判。
Python数据清洗:缺失值处理与异常值检测
系统掌握使用Python与Pandas进行数据清洗的方法,从识别缺失值、选择合理的填补或删除策略,到检测异常值并验证清洗效果,避免因盲目处理导致数据偏差。
SQLAlchemy 事务避坑指南:Session 生命周期与异常处理
在 SQLAlchemy 开发中,Session 不仅是对象状态的跟踪器,更是数据库事务的边界载体。许多数据不一致问题源于对 Session 生命周期、事务提交机制及异常回滚的误解。本文从 Session 的工作单元本质出发,解析 flush 与 commit 的行为差异,探讨并发场景下的请求级 S
Redis 与 Memcached 选型指南:从架构差异到生产实践
本文不单纯比较 QPS 峰值,而是从架构原理出发,解析 Redis 与 Memcached 在数据模型、内存管理与并发处理上的本质差异。通过统一环境的基准测试与真实业务场景分析,揭示在 Session 存储、复杂数据结构及高并发读写下的性能表现与瓶颈。文章最后提供针对缓存穿透、雪崩及大 Key 问题
Linux服务器初始化:防火墙与SELinux策略配置
从服务器初始化安全基线出发,系统梳理防火墙规则与SELinux策略的配置、验证、联动排障及常见避坑方法,帮助在保证服务可用的同时建立合理的访问控制边界。
- 热门数据榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-10-09 20:56
2026-10-09 20:51
2026-10-09 20:46
2026-10-09 20:41
2026-10-09 20:36
2026-10-09 20:31
2026-10-09 20:26
2026-10-09 20:21
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

