25

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 用户名2

uid=1466(username2) gid=513(DomainUsers) groups=513(DomainUsers)

LDAP 中的所有用户(/etc/nsswitch.conf 正确,一切正确 - 但只有此用户不显示)

为什么显示 uid 号 (1466) 而不是用户名?

4

4 回答 4

38

ps -ef在(POSIX) 或ps aux(BSD-derivatives) 中列出的用户名有 8 个字符的限制。选项说明

我已经在 Mac 和 Linux 机器上搜索了手册页,但没有看到那里记录的限制。

该问题确实经常出现在论坛上,并以 8 个字符的限制作为答案。

终于偶然发现了这个页面,其中报告了针对 Debian 的“错误”,但由于不是错误而关闭。他们引用了这个页面,该页面还声称当名称太长时 POSIX 和 UNIX 标准如何要求回退到 uid。也不是来自实际的 POSIX 标准。

我不知道这是否具有权威性,但它确实解释了您使用 9 个字符的用户名看到的行为。:)

也许其他人可以发布更权威链接的答案?

于 2011-09-16T06:38:21.807 回答
11

正如 Ray Toal 提到的,它仅限于 8 个字符的限制。正如 Ray 所提到的,这不是错误,而是标准的一部分。如果您检查psprocps包的一部分)的源代码,其中一条评论说

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 部分中的链接,它会显示字段(userrusergrouprgroup)如果可以获得并且字段宽度允许,则将打印,否则将打印十进制表示。 用户和组名字段宽度限制为 8 的原因可能是为了支持旧版,但这只是猜测。

于 2011-09-16T12:08:21.447 回答
3

ps -eo user:$(cut -d: -f1 /etc/passwd | wc -L),pid,ppid,c,stime,tname,time,cmd

-o选项用于指定ps命令输出的用户定义格式。

指定的用户定义格式表示输出 user、pid、ppid、stime、tname、time 和 cmd 字段。

cut -d: -f1 /etc/passwd | wc -L确定密码文件中最长登录名的字符数。因此user:$(cut -d: -f1 /etc/passwd | wc -L)告诉 ps 命令使用最长登录名的最大长度输出用户字段。

于 2014-07-25T09:37:11.293 回答
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 字符)看起来像往常一样,并且不介意输出中的几个长用户名与标题不对齐,您可以执行以下操作:

ps ax -o user:40,pid,ppid,c,stime,tname,time,cmd | perl -pe 'if (/^(\S+)/ and length $1 > 8) {s/^(\S+)\s+/$1 /} else { s/^(.{9})\s+/$1/} '

这样做是使输出用户名列非常长(-o user:40),然后对输出进行后处理,因此长用户名(length $1 > 8)与下一列之间只有一个空格,并且短用户名(else {)被修剪回默认值(最多 8 个字符的用户名,其余第 9 个字符为空格)

于 2014-08-27T12:11:06.287 回答