在 Linux 运维中,确认进程以哪个用户身份运行、属于哪个用户组,是权限排查和故障定位的基础。本文总结 4 种常用方法。
如果你需要确认某个进程到底以哪个用户组身份运行,不再靠猜。
TL;DR
最直接的方法是让 ps 同时输出 USER 和 GROUP 列,一行就能看到对应关系。
ps -eo pid,user,group,comm
如果需要按特定 PID 过滤,配合 grep 即可:
ps -eo pid,user,group,comm | grep '^ 1 '
方法一:ps 直接列出
注意 ps 输出的是有效组(effective group),也就是进程实际使用的组。如果进程通过 setgid 切换过组,这里显示的是切换后的值。[1]
方法二:/proc 文件系统
每个进程在 /proc/<PID>/ 下都有运行时信息文件。status 文件包含 UID、GID 和附加组的数字 ID。
cat /proc/1/status | grep -E '^(Uid|Gid|Groups)'
输出示例:
Uid: 0 0 0 0
Gid: 0 0 0 0
Groups:
前四个数字分别是真实/有效/保存/文件系统 UID,GID 同理。Groups 行列出附加组的数字 ID,空表示没有附加组。要将数字 ID 转成名称,可配合 getent group 或 awk 查询 /etc/group。[2]
方法三:systemd 服务信息
对于 systemd 托管的服务,可以直接查询其配置中的 User= 和 Group= 值。
systemctl show -p User,Group systemd-journald
如果服务未显式设置 User=,则默认以 root 运行,输出为 User= 和 Group= 后为空值。这与 /proc/<PID>/status 中的 UID/GID 可以交叉验证。[3]
方法四:用户附加组查询
如果目标进程属于某个已知用户,可以查看该用户的全部附加组,再判断进程是否在组内。
id -Gn huyuanwen
id 命令列出真实/有效/附加组。注意这里显示的是用户的组列表,不是单个进程的实时组;如果进程在运行中调用了 setgid(),与用户初始组可能不同。[4]
排错速查
| 现象 | 可能原因 | 处理 |
|---|---|---|
ps -eo ... group 列为空 |
进程已退出或 PID 不存在 | 换一个正在运行的 PID 重试 |
/proc/PID/status 无 Groups 行 |
该进程没有附加组 | 正常现象,root 进程通常如此 |
systemctl show 返回空 User/Group |
服务未设置 User=,默认 root | 检查 User= 与 DynamicUser= 配置 |
id -Gn 结果与 ps 不一致 |
进程运行时调用了 setgid | 以 /proc/PID/status 为准 |
局限性
- WSL2 环境中 systemd 兼容性与原生 systemd 略有差异,部分
systemctl行为可能不同。 - 容器环境(Docker/Podman)内的 PID 命名空间隔离后,宿主机看到的 PID 与容器内不一致。
- 实时变化的进程(如短生命周期的 worker)可能来不及查看就已退出。
附录:实测记录
- 测试环境:WSL2 Ubuntu,Linux 5.15,systemd 249
- 测试日期:2026-11-03
- 观察结果:
ps -eo pid,user,group,comm正确显示 systemd-journald 的组为 root;/proc/1/status的 Uid/Gid 均为 0;systemctl show -p User,Group systemd-journald返回空值,与 root 默认行为一致。
参考资料
- [1] ps(1) – Linux manual page (man7.org)(psman)
- [2] proc_pid_status(5) – Linux manual page (kernel.org)(procman)
- [3] systemd.exec(5) – Linux manual page (man7.org)(systemdman)
- [4] id(1) – Linux manual page (man7.org)(idman)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。