ps -o uid 显示纯数字是因为输出内核原始 uid,不查 /etc/passwd;查用户名应优先用 ps -o user,-u(大写)按 uid 数值筛选进程,缺执行权限可 ls -l 快速定位。

直接看 UID 数字用 ps -o uid,要查用户名必须用 user 字段;程序跑不起来多半是缺 x 权限,ls -l 一眼就能确认。
ps -o uid 显示的为什么全是数字,不是用户名?
因为 uid 是内核级数值标识(比如 1001),ps -o uid 默认不查 /etc/passwd 做映射——它输出的就是原始 UID,完全正确,不是命令写错了。
- 想给人看或调试,优先用
user字段:ps -o user,pid,cmd,兼容性好,自动查表转成用户名 -
euser和ruser也能转用户名,但语义不同:euser是有效用户(常用于 setuid 场景),ruser是启动时的真实用户,日常排查用user最稳妥 - 别混写
ps -o uid,user:字段重复,老版本ps可能错位输出,白费排查时间
怎么按 UID 筛选进程,而不是用户名?
-u 和 -U 容易搞反:-u(小写)按**用户名**过滤,-U(大写)才是按**UID 数值**过滤。
- 查 UID 为 0 的所有进程:
ps -U 0 -o pid,uid,cmd - 查 UID 为 1001 的进程并限制字段:
ps -U 1001 -o pid,%cpu,cmd - 如果非要用
ps -eo uid,pid,cmd | awk筛,注意字段顺序必须和-o一致,比如awk '$1 == 1001'才能匹配第一列 UID - 容器场景要小心:宿主机看到的 UID 可能是映射后的(如 100001),但容器内
ps仍显示原始 UID(如 1001),跨命名空间排查得结合/proc/[pid]/status的Uid:行交叉验证
程序执行报 Permission denied,怎么快速定位权限问题?
90% 是文件没加 x 位,ls -l 第一列最右边三个字符就是关键。
- 执行
ls -l ./myapp,如果权限是-rw-r--r--,说明缺x,直接chmod +x ./myapp -
chmod 755比777更安全:所有者可读写执行,组和其他人只读+执行,避免过度授权 - 目录也需要
x权限才能cd进入;没有x的目录,即使有r也列不出内容(ls: cannot open directory) - 脚本类文件(如
.sh)还要注意 shebang 是否合法、解释器路径是否存在,file ./script.sh可辅助判断类型
想确认当前用户或进程的真实 UID,该用哪个命令?
id 和 /proc/[pid]/status 是最直接的来源,比从 ps 推导更可靠。
- 查当前用户 UID:
id -u(数字)、id -un(用户名) - 查某进程真实 UID:
cat /proc/1234/status | grep Uid,输出四列(Real、Effective、Saved、FS),其中第一列Uid:是真实 UID - 对比
ps -o ruid,pid和/proc/[pid]/status的Uid:行,能快速识别是否被 setuid 修改过有效 UID - 普通用户运行
ps查不到其他用户的进程详情,需要sudo ps或提前确认权限上下文
UID 数字本身不带语义,user 字段才对应人类可读名;而执行权限不是“有没有”,是“对谁有没有”——ls -l 看清三段权限,再决定加 u+x 还是 o+x,比盲目 chmod 777 少踩八成坑。











