首页 > Sysadmin > 正文

查看 Linux 进程所属用户组

huyuanwen 2026-11-03 Sysadmin

在 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 默认行为一致。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。