当前位置: 首页
编程语言
Linux中使用pgrep按进程名称查找PID的方法详解

Linux中使用pgrep按进程名称查找PID的方法详解

时间:2026-08-14
转载

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,结果更清晰,使用也更高效。

Linux使用pgrep命令按名称查找进程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 建立可复现的性能基线:从对比到回归

本文介绍如何利用 pytest-benchmark 为 Python 代码建立可重复的性能基准,通过基准测试、对比分析和结果验证定位性能差异,同时避免测试环境、数据规模和统计方式带来的误判。

时间:2026-10-09 20:56
Python数据清洗:缺失值处理与异常值检测

Python数据清洗:缺失值处理与异常值检测

系统掌握使用Python与Pandas进行数据清洗的方法,从识别缺失值、选择合理的填补或删除策略,到检测异常值并验证清洗效果,避免因盲目处理导致数据偏差。

时间:2026-10-09 20:51
SQLAlchemy 事务避坑指南:Session 生命周期与异常处理

SQLAlchemy 事务避坑指南:Session 生命周期与异常处理

在 SQLAlchemy 开发中,Session 不仅是对象状态的跟踪器,更是数据库事务的边界载体。许多数据不一致问题源于对 Session 生命周期、事务提交机制及异常回滚的误解。本文从 Session 的工作单元本质出发,解析 flush 与 commit 的行为差异,探讨并发场景下的请求级 S

时间:2026-10-09 20:46
Redis 与 Memcached 选型指南:从架构差异到生产实践

Redis 与 Memcached 选型指南:从架构差异到生产实践

本文不单纯比较 QPS 峰值,而是从架构原理出发,解析 Redis 与 Memcached 在数据模型、内存管理与并发处理上的本质差异。通过统一环境的基准测试与真实业务场景分析,揭示在 Session 存储、复杂数据结构及高并发读写下的性能表现与瓶颈。文章最后提供针对缓存穿透、雪崩及大 Key 问题

时间:2026-10-09 20:41
Linux服务器初始化:防火墙与SELinux策略配置

Linux服务器初始化:防火墙与SELinux策略配置

从服务器初始化安全基线出发,系统梳理防火墙规则与SELinux策略的配置、验证、联动排障及常见避坑方法,帮助在保证服务可用的同时建立合理的访问控制边界。

时间:2026-10-09 20:36
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜