【问题标题】:Running processes. Why displayed uid number instead username? [closed]运行进程。为什么显示 uid 号而不是用户名? [关闭]
【发布时间】:2011-09-16 06:13:34
【问题描述】:

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) 而不是用户名?

【问题讨论】:

  • 可能是因为 UID 号的最大长度是可以预测的,而用户名可能很长?
  • 是的,它是用户名的长度(如果超过 8 个字符,则ps aux 将用 uid 代替名称)。现在运行man ps 以获取详细信息。

标签: linux uid


【解决方案1】:

ps -ef (POSIX) 或 ps aux (BSD-derivatives) 中列出的用户名有 8 个字符的限制。 Explanation of options

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

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

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

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

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

【讨论】:

  • ps aux 是正常的 BSD 语法。您列为 BSD 的东西是旧的 SysV 系统税。
  • 哎呀倒退了。谢谢@pst。固定。
【解决方案2】:

正如 Ray Toal 所提到的,它被限制为 8 个字符的限制。正如 Ray 所提到的,这不是错误,而是标准的一部分。如果您查看psprocps 包的一部分)的源代码,其中一个 cmets 会说

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,则表示字段(userrusergroup, rgroup) 如果可以获取并且字段宽度允许,将打印,否则将打印十进制表示。
用户和组名字段宽度限制为 8 的原因可能是 legacy support,但这只是猜测。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 您能否添加一些有关该命令正在执行的操作的其他信息?
    【解决方案4】:

    对于 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 对于短用户名(

    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 个字符是空格)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 2018-08-23
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      相关资源
      最近更新 更多