ps -eaf
...
kude 22593 12078 0 09:06 ? 00:00:02 smbd -D hasi 22929 12078 0 09:12 ? 00:00:00 someprog.pl root 22950 43 0 Sep08 ? 00:00:19 [nfsiod] root 24558 43 0 Sep09 ? 00:00:28 [pdflush] root 25320 1 0 00:00 ? 00:00:01 /usr/bin/atop -a -w /var/log/atop/atop_20110916 600 1466 25757 12078 0 10:12 ? 00:00:00 smbd -D root 26752 12078 0 10:32 ? 00:00:01 smbd -D
...
id username2
uid = 1466(username2)gid = 513(DomainUsers)groups = 513(DomainUsers)
LDAP中的所有用户(/etc/nsswitch.conf都是正确的,一切正确 - 但只有这个用户不显示)
为什么显示uid号码(1466)而不是用户名?
答案 0 :(得分:38)
在ps -ef
(POSIX)或ps aux
(BSD衍生物)中列出了用户名的8个字符限制。 Explanation of options
我在Mac和Linux机器上搜索了手册页,并没有看到那里记录的限制。
这个问题经常出现在论坛上,其中包含8个字符的限制作为答案。
我确实最终偶然发现了this page,其中针对Debian报告了“bug”,但结果是不是bug 。他们引用了this page,这也说明了当名称太长时,POSIX和UNIX标准如何要求回退到uid。也不是来自实际的POSIX标准。
我不知道这是否具有权威性,但它确实解释了您使用9个字符的用户名所看到的行为。 :)
也许其他人可以在更具权威性的链接上发布答案?
答案 1 :(得分:11)
Ray Toal提到它仅限于8个字符的限制。这不是一个bug,而是Ray提到的标准的一部分。如果您检查ps
(procps
包的一部分)的源代码,其中一条评论说
The Open Group Base Specifications Issue 6 (IEEE Std 1003.1, 2004 Edition)
requires that user and group names print as decimal numbers if there is
not enough room in the column, so tough luck if you don't like it.
The UNIX and POSIX way to change column width is to rename it:
ps -o pid,user=CumbersomeUserNames -o comm
The easy way is to directly specify the desired width:
ps -o pid,user:19,comm
如果您在 STDOUT 部分查看link,则会显示字段(用户, ruser ,如果可以获得并且字段宽度允许,则打印组, rgroup ),否则将打印小数表示。
用户&组名字段宽度限制为8可以是legacy support,但这只是猜测。
答案 2 :(得分:3)
ps -eo user:$(cut -d: -f1 /etc/passwd | wc -L),pid,ppid,c,stime,tname,time,cmd
-o
选项用于为ps
命令的输出指定用户定义的格式。
指定的用户定义格式表示输出用户,pid,ppid,stime,tname,time和cmd字段。
cut -d: -f1 /etc/passwd | wc -L
确定密码文件中最长登录名中的字符数。因此user:$(cut -d: -f1 /etc/passwd | wc -L)
告诉ps命令使用最长登录名的最大长度输出用户字段。
答案 3 :(得分:0)
对于moosaka的回答更加动态的长度输出(例如,如果您的用户名很少,但很少使用,并且您不希望大部分时间都浪费屏幕),你可以使用:
ps -eo user:$(ps axho uid | sort -u | xargs getent passwd | cut -f1 -d:| wc -L),pid,ppid,c,stime,tname,time,cmd
它将使用户名列的长度与当前正在运行的进程的最长用户名一样长。 (请注意,它不是防弹的,如果在命令运行时,如果新的进程具有较长的用户名,则可能仍然会显示一个数字。但是在99.99%的时间内,它的输出更好)
说明:$(ps axho uid [...] | wc -L)
计算当前正在运行的进程的最大用户名长度,然后我们使用该用户名长度执行普通ps
或者,如果你希望ps看起来像普通的短用户名(< = 8 chars),并且不介意输出中的少数长用户名与标题不对齐,你可以这样做:
ps ax -o user:40,pid,ppid,c,stime,tname,time,cmd | perl -pe' if(/ ^(\ S +)/和length $ 1> 8){s / ^(\ S +)\ s + / $ 1 /} else {s / ^(。{9})\ s + / $ 1 /}'
它的作用是使输出用户名列很长(-o user:40
),然后对输出进行后处理,以便用户名(length $1 > 8
)在它们和下一列之间只有一个空格,以及短用户名( else {
)被修剪回默认值(最多8个字符用户名,其余第9个字符为空格)