Выполняемый процесс. Почему отображается номер uid вместо имени пользователя? [закрытый]

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

..

идентификатор пользователю имя_пользователя2

uid=1466(username2) gid=513(DomainUsers) группы=513 (DomainUsers)

все пользователи в LDAP (/etc / nsswitch.conf правильно, все правильно - но только этот пользователь не показывает)

почему отображается номер uid (1466) вместо имени пользователя?

4 ответов


существует ограничение в 8 символов для имен пользователей, которые будут перечислены в ps -ef (POSIX) или ps aux (BSD-производные). объяснение вариантов

Я искал man-страницы как на MACS, так и на Linux-боксах и не видел этого ограничения, записанного там.

вопрос обычно появляется на форумах с 8-символьным лимитом в качестве ответа.

Я сделал наконец, не наткнется на на этой странице, в котором "Буг" сообщалось против Debian, но закрыт как не ошибка. Они ссылаются на этой странице что также делает утверждение о том, как стандарты POSIX и UNIX требуют возврата к uid, когда имена слишком длинные. Также не из фактического стандарта POSIX.

Я не знаю, является ли это авторитетным, но это объясняет поведение, которое вы видите с 9-символьным именем пользователя. :)

может быть, кто-то может дать ответ на более авторитетную ссылку?


как упоминает Рэй Тоал, он ограничен 8-символьным пределом. Это не ошибка, а часть стандарта, как упоминалось Рэем. Если вы проверяете исходный код 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 в нем говорится, что поля (пользователей, Русер, группа, rgroup) будет напечатан если его можно получить и ширина поля позволяет, или десятичное представление в противном случае.
Причина, по которой ширина поля имени пользователя и группы ограничена 8, может быть для поддержка но это только предположение.


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

на -o опция используется для указания пользовательского формата для вывода .

указанный пользовательский формат указывает на вывод полей user, pid, ppid, stime, tname, time и cmd.

cut -d: -f1 /etc/passwd | wc -L определяет количество символов в самом длинном имени пользователя в файле паролей. Поэтому user:$(cut -d: -f1 /etc/passwd | wc -L) сообщает команде ps вывести поле пользователя, используя максимальную длину самого длинного имени входа.


для еще более динамического вывода длины, что ответ moosaka (например, если у вас есть несколько очень длинных имен пользователей, но которые очень редко используются, и вы не хотите экран впустую большую часть времени), вы можете использовать:

ПС-эо пользователя:$(ПС axho жидкости | то -у | команды xargs getent passwd и | вырезать -Ф1 -д: | туалет -л),пид -, двух,в,стиме,tname,время,КМД

это сделает длину столбца имени пользователя так же долго, как самое длинное имя пользователя текущего процесса. (Отмечать однако он не пуленепробиваемый, и если новый процесс с более длинным именем пользователя запускается в доли секунды во время выполнения команды, вы все равно можете получить номер. Но в 99,99% случаев это намного приятнее)

объяснение: $(ps axho uid [...] | wc -L) вычисляет максимальную длину имени пользователя текущего процесса, а затем мы выполняем обычный ps с этой длиной имени пользователя

альтернативно, если вы хотите, чтобы ps выглядел как обычно для коротких имен пользователей (

ps ax-o пользователь: 40, pid, ppid, c, stime,tname,time, cmd | perl-pe 'if (/^(\S+)/ и длина $1 > 8) {s/^(\S+)\s+/$1 /} else { s/^(.{9})\s+ / $1/}'

что это делает, так это сделать столбец имени пользователя вывода очень длинным (-o user:40), а затем postprocesses выход так долго Логинов (length > 8) имеют только одно пространство между ними и следующим столбцом и короткие имена пользователей (else {) являются обрезано по умолчанию (до 8 символов имени пользователя, а остальные до 9 символов пробелами)