Подтвердить что ты не робот

Запуск процессов. Зачем показывать номер 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

..

id username2

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

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

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

4b9b3361

Ответ 1

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

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

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

Наконец-то я наткнулся на эту страницу, в которой сообщалось о "ошибке" в Debian, но закрыто как не ошибка. Они ссылаются на на этой странице, в котором также говорится о том, как стандарты POSIX и UNIX требуют возврата к uids, когда имена слишком длинны. Также не из реального стандарта POSIX.

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

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

Ответ 2

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

Ответ 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 выводить поле пользователя, используя максимальную длину самого длинного имени входа.

Ответ 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 выглядел как обычный для коротких имен пользователей (< = 8 символов), и не возражайте, чтобы несколько длинних имен пользователей на выходе были смещены с заголовками, вы можете сделать что-то вроде:

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

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