一、命令简介
pgrep命令是 Linux 系统中用于根据进程名称或其他属性查找进程 ID(PID)的实用工具。它通过搜索 /proc目录下的进程信息,快速定位匹配条件的进程,并返回对应的 PID。相比传统的 ps | grep组合,pgrep 更加高效且功能丰富,是进程管理和脚本编写中的常用工具。
二、基本语法
pgrep [选项] 模式
权限要求:普通用户只能查看自己拥有的进程,root 用户可以查看所有进程。 核心功能:根据进程名称、用户、终端等条件查找进程,并返回 PID 列表。
三、常用选项详解
| 选项 | 全称 | 功能说明 | 示例 |
|---|---|---|---|
-l | --list-name | 显示进程名称和 PID | pgrep -l sshd |
-f | --full | 匹配完整的命令行 | pgrep -f "nginx.*master" |
-u | --euid | 匹配指定用户(用户名或 UID) | pgrep -u root |
-U | --uid | 匹配实际用户(非有效用户) | pgrep -U alice |
-g | --pgroup | 匹配进程组 ID | pgrep -g 1000 |
-G | --group | 匹配实际组 ID | pgrep -G 1000 |
-t | --terminal | 匹配终端 | pgrep -t pts/0 |
-n | --newest | 只显示最新的进程 | pgrep -n firefox |
-o | --oldest | 只显示最旧的进程 | pgrep -o firefox |
-P | --parent | 匹配父进程 ID | pgrep -P 1234 |
-x | --exact | 精确匹配进程名 | pgrep -x sshd |
-d | --delimiter | 指定输出分隔符(默认换行) | pgrep -d, sshd |
-v | --inverse | 反向匹配,显示不匹配的进程 | pgrep -v root |
-c | --count | 只显示匹配的进程数量 | pgrep -c sshd |
-i | --ignore-case | 忽略大小写 | pgrep -i SSH |
四、实际应用场景
4.1 基本查找
# 查找 sshd 进程的 PID
pgrep sshd
# 显示进程名和 PID
pgrep -l sshd
# 精确匹配进程名
pgrep -x sshd
4.2 多条件组合
# 查找 root 用户的 sshd 进程
pgrep -u root sshd
# 查找指定终端的进程
pgrep -t pts/0 bash
# 查找指定进程组的进程
pgrep -g 1000
4.3 高级匹配
# 匹配完整的命令行
pgrep -f "nginx.*master"
# 反向匹配,查找非 root 用户的进程
pgrep -v -u root
# 忽略大小写匹配
pgrep -i SSH
4.4 进程管理
# 终止所有 firefox 进程
pkill firefox
# 终止指定用户的进程
pkill -u alice firefox
# 发送特定信号
pkill -TERM firefox
五、输出格式控制
5.1 默认输出
# 默认以换行符分隔 PID
pgrep sshd
# 输出:1234
# 5678
5.2 自定义分隔符
# 使用逗号分隔
pgrep -d, sshd
# 输出:1234,5678
# 使用空格分隔
pgrep -d" " sshd
# 输出:1234 5678
5.3 统计数量
# 只显示匹配的进程数量
pgrep -c sshd
# 输出:2
六、与相关命令对比
6.1 pgrep vs ps | grep
# 传统方式(不推荐)
ps aux | grep sshd | grep -v grep | awk '{print $2}'
# pgrep 方式(推荐)
pgrep sshd
优势:
- 更简洁高效
- 避免 grep 自身进程干扰
- 支持更多匹配选项
6.2 pgrep vs pidof
# pidof 只能精确匹配进程名
pidof sshd
# pgrep 支持更多功能
pgrep -f "sshd.*config"
优势:
- pgrep 支持正则表达式和完整命令行匹配
- pgrep 支持用户、终端等多条件筛选
七、实际应用示例
7.1 监控进程状态
#!/bin/bash
# 检查服务是否运行
SERVICE="nginx"
if pgrep -x "$SERVICE" > /dev/null; then
echo "$SERVICE 正在运行"
else
echo "$SERVICE 未运行"
# 启动服务
systemctl start $SERVICE
fi
7.2 批量终止进程
#!/bin/bash
# 终止指定用户的所有进程
USER="testuser"
# 检查用户是否存在
if id "$USER" &>/dev/null; then
# 终止该用户的所有进程
pkill -u "$USER"
echo "已终止用户 $USER 的所有进程"
else
echo "用户 $USER 不存在"
fi
7.3 查找僵尸进程
#!/bin/bash
# 查找僵尸进程
ZOMBIE_PIDS=$(ps aux | awk '$8=="Z" {print $2}')
if [ -n "$ZOMBIE_PIDS" ]; then
echo "发现僵尸进程:"
echo "$ZOMBIE_PIDS"
# 终止父进程
for pid in $ZOMBIE_PIDS; do
parent_pid=$(ps -o ppid= -p $pid)
echo "终止父进程 $parent_pid"
kill -TERM $parent_pid
done
else
echo "未发现僵尸进程"
fi
八、注意事项
8.1 权限限制
# 普通用户只能查看自己的进程
pgrep -u root
# 可能需要 sudo 权限
sudo pgrep -u root
8.2 信号处理
# 使用 pkill 终止进程时,建议先发送 TERM 信号
pkill -TERM process_name
# 如果 TERM 无效,再使用 KILL
pkill -KILL process_name
8.3 精确匹配
# 避免误杀,使用精确匹配
pgrep -x process_name
# 或使用完整命令行匹配
pgrep -f "process_name.*args"
九、常见问题
9.1 找不到进程
# 检查进程是否存在
ps aux | grep process_name
# 确认进程名是否正确
pgrep -l process_name
9.2 权限不足
# 使用 sudo 提升权限
sudo pgrep -u root
# 或切换到 root 用户
su - root
pgrep -u root
9.3 输出格式问题
# 使用 -d 选项指定分隔符
pgrep -d, process_name
# 或使用 xargs 处理输出
pgrep process_name | xargs -n 1 echo "PID:"
十、总结
pgrep命令是 Linux 进程管理中的强大工具,通过灵活的匹配选项和简洁的语法,可以快速定位和管理进程。相比传统的 ps | grep组合,pgrep 更加高效、安全,特别适合在脚本中使用。掌握 pgrep 的使用方法,能够显著提升系统管理和故障排查的效率。