linux pgrep命令

pgrep命令 用于查找正在运行的进程的进程ID。它通过匹配进程的名称或其他属性来搜索进程,并将匹配的进程ID输出到标准输出。pgrep是procps或procps-ng软件包的一部分。

命令格式

pgrep [选项] 模式

常用选项

选项 说明
-l 显示进程名称和进程ID
-f 匹配完整的命令行(包括参数)
-u 匹配指定用户拥有的进程
-x 精确匹配进程名称
-n 显示最新的(最近的)匹配进程
-o 显示最老的匹配进程
-P 匹配指定父进程ID的子进程
-G 匹配指定组ID的进程
-U 匹配指定UID(用户ID)的进程
-t 匹配指定终端(tty)的进程
-a 显示完整的命令行
-c 统计匹配的进程数量
-d 分隔符 指定输出分隔符(默认是换行)
-v 反向匹配,显示不匹配的进程
-i 忽略大小写

pgrep与pkill关系

pgreppkill 是兄弟命令,它们使用相同的匹配规则:

  • pgrep:查找并显示匹配的进程ID
  • pkill:查找并发送信号给匹配的进程(默认发送SIGTERM信号)
注意: 使用pkill命令时要特别小心,避免误杀重要进程!

使用实例

1. 查找指定名称的进程ID(基本用法)
# 查找nginx进程的PID
pgrep nginx

# 查找包含"php"的进程
pgrep php
2. 显示进程名称和进程ID
# 显示进程名和PID
pgrep -l nginx
3. 显示完整的命令行
# 显示完整的命令行
pgrep -a nginx
4. 匹配完整的命令行(包括参数)
# 匹配包含特定参数的进程
pgrep -f "nginx: master process"

# 查找使用特定端口的进程
pgrep -f ":80"
5. 精确匹配进程名称
# 只匹配完全为"nginx"的进程名(不会匹配"nginx-worker")
pgrep -x nginx
6. 查找指定用户的进程
# 查找root用户的nginx进程
pgrep -u root nginx

# 查找www-data用户的进程
pgrep -u www-data
7. 查找最新/最老的匹配进程
# 显示最新的nginx进程
pgrep -n nginx

# 显示最老的nginx进程
pgrep -o nginx
8. 查找指定父进程的子进程
# 查找父进程ID为1的所有子进程
pgrep -P 1
9. 统计匹配的进程数量
# 统计nginx进程数量
pgrep -c nginx
10. 指定输出分隔符
# 用逗号分隔PID
pgrep -d "," nginx
11. 反向匹配(显示不匹配的)
# 显示不是root用户的进程
pgrep -v -u root
12. 忽略大小写
# 忽略大小写匹配
pgrep -i NGINX
13. 组合使用多个选项
# 查找www-data用户的nginx进程,显示名称和PID
pgrep -lu www-data nginx

# 查找nginx主进程的完整命令行
pgrep -fax nginx
14. 与命令替换结合使用
# 用pgrep找到的PID来kill进程
kill $(pgrep nginx)

# 查看进程的详细信息
ps -p $(pgrep nginx)

# 查看进程打开的文件
lsof -p $(pgrep nginx)

实际输出示例

示例1:查找nginx进程
$ pgrep -l nginx
1234 nginx
1235 nginx
1236 nginx
示例2:显示完整命令行
$ pgrep -a nginx
1234 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
1235 nginx: worker process
1236 nginx: worker process
示例3:统计进程数量
$ pgrep -c nginx
3
示例4:使用逗号分隔输出
$ pgrep -d "," nginx
1234,1235,1236

实用技巧和场景

监控场景
  • 检查服务是否正在运行
  • 监控特定用户的进程活动
  • 查找占用资源的进程
  • 验证守护进程状态
脚本编程
  • 自动化脚本中检查进程
  • 服务启动/停止脚本
  • 监控告警脚本
  • 批量进程管理

实用脚本示例

#!/bin/bash
# 检查服务是否运行,如果没运行则启动
SERVICE="nginx"
if pgrep -x "$SERVICE" >/dev/null
then
    echo "$SERVICE 服务正在运行"
else
    echo "$SERVICE 服务未运行,正在启动..."
    systemctl start $SERVICE
fi

# 监控特定进程的内存使用
while true; do
    PIDS=$(pgrep nginx)
    for PID in $PIDS; do
        MEM_USAGE=$(ps -p $PID -o %mem | tail -1)
        echo "PID $PID 内存使用: $MEM_USAGE%"
    done
    sleep 5
done

与其他命令对比

命令 主要用途 优点 缺点
pgrep 通过名称查找进程ID 专门为查找PID设计,选项丰富 功能相对单一
ps + grep 查找和筛选进程信息 功能强大,显示信息全面 输出需要额外解析,语法复杂
pidof 查找进程ID 简单易用,快速查找 功能简单,选项少
pkill 查找并杀死进程 查找和操作一体化 可能误杀进程,需谨慎

pgrep vs ps + grep

传统方式:

ps aux | grep nginx | grep -v grep | awk '{print $2}'

现代方式:

pgrep nginx

pgrep更加简洁、安全,避免了误匹配到grep进程本身的问题。

注意:
  • 默认情况下,pgrep匹配进程名称(不是命令行)
  • 使用-f选项可以匹配完整的命令行
  • pgrep默认只输出进程ID,不输出其他信息
  • 多个匹配的进程ID默认每行显示一个
  • 如果没有匹配的进程,pgrep会返回1(非零)退出码
  • 在脚本中使用时,建议检查退出码来判断进程是否存在

安装说明

pgrep命令通常包含在procps或procps-ng软件包中,大多数Linux发行版默认已安装。

# 检查是否已安装
which pgrep
或
pgrep --version

# Ubuntu/Debian安装(如果需要)
sudo apt-get install procps

# CentOS/RHEL/Fedora安装
sudo yum install procps-ng

# Arch Linux
sudo pacman -S procps-ng

# 验证安装
pgrep --help

相关命令

ps

显示当前进程状态

查看详情
pkill

查找并发送信号给进程

查看详情
pidof

查找进程ID(简化版)

查看详情