2011-09-16 21 views
21

ps -eafProcesos en ejecución. ¿Por qué aparece el número de uid en lugar del nombre de usuario?

..

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 

..

Identificación nombredeusuario2

uid = 1466 (USERNAME2) gid = 513 (DomainUsers) = 513 (grupos) DomainUsers

Todos los usuarios en LDAP (/etc/nsswitch.conf es correcta, todo es correcto - pero sólo este usuario no muestran)

¿Por qué se muestra el número de uid (1466) en lugar del nombre de usuario?

+1

¿Quizás porque los números de UID tienen una longitud máxima bastante predecible, mientras que los nombres de usuario pueden ser bastante largos? –

+10

Sí, es la longitud del nombre de usuario (Si tiene más de 8 caracteres, entonces 'ps aux' sustituirá el uid por el nombre). Ejecutando 'man ps' ahora para obtener detalles. –

Respuesta

35

Hay un límite de 8 caracteres para los nombres de usuario que se enumeran en ps -ef (POSIX) o ps aux (BSD-derivados). Explanation of options

He buscado páginas de manual en cuadros Macs y Linux y no he visto ese límite registrado allí.

La pregunta aparece rutinariamente en foros con el límite de 8 caracteres como respuesta.

me hicieron finalmente tropezar con this page en el que se reportó el "error" en contra de Debian, pero cerró como no un error. Hacen referencia al this page, que también hace un reclamo sobre cómo los estándares POSIX y UNIX requieren volver a los líquidos cuando los nombres son demasiado largos. Tampoco del estándar POSIX real.

No sé si esto es autoritario, pero explica el comportamiento que está viendo con un nombre de usuario de 9 caracteres. :)

¿Tal vez alguien más puede publicar una respuesta a un enlace más autorizado?

+0

'ps aux' es la sintaxis BSD normal. Lo que ha enumerado como BSD es, en cambio, el viejo systax SysV. – tchrist

+0

Vaya hacia atrás. Gracias @pst. Fijo. –

11

Como menciona Ray Toal, está limitado al límite de 8 caracteres. Esto no es un error sino parte de la norma nuevamente como lo menciona Ray. Si marca el código fuente de ps (parte de procps paquete) uno de los comentarios dice

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 

Si marca la link en la sección STDOUT dice que los campos (usuario, ruser , grupo, rgroup) se imprimirá si se puede obtener y el ancho del campo lo permite, o una representación decimal de lo contrario.
La razón por la que los anchos de campo del nombre del grupo & del usuario están restringidos a 8 podría ser para legacy support, pero eso es solo una suposición.

3

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

La opción -o se utiliza para especificar un usuario formato definido para la salida del comando ps.

El formato definido por el usuario especificado dice que muestre los campos usuario, pid, ppid, stime, tname, time y cmd.

cut -d: -f1 /etc/passwd | wc -L determina el número de caracteres en el nombre de inicio de sesión más largo en el archivo de contraseña. Por lo tanto, user:$(cut -d: -f1 /etc/passwd | wc -L) le dice al comando ps que muestre el campo de usuario usando la longitud máxima del nombre de inicio de sesión más largo.

+0

¿podría agregar algo de información adicional sobre lo que está haciendo el comando? – dmportella

0

Para una salida de longitud más dinámica que la respuesta de moosaka (por ejemplo, si tiene pocos nombres de usuario muy largos, pero los usa muy raramente y no quiere que la pantalla pierda la mayor parte del tiempo), puede usar:

usuario de EP-EO: $ (UID ps axho | sort -u | xargs getent passwd | corte f1 -d: | wc -l), pid, ppid, c, stime, tname, tiempo, cmd

Hará que la longitud de la columna de nombre de usuario sea tan larga como el nombre de usuario más largo del proceso en ejecución. (Tenga en cuenta que no es a prueba de balas sin embargo, y si el nuevo proceso con nombre de usuario más largo comienza en la fracción de segundo mientras se ejecuta el comando, aún puede obtener un número mostrado. Pero el 99.99% de las veces es mucho mejor)

explicación: $(ps axho uid [...] | wc -L) calcula la longitud máxima de nombre de usuario del proceso en ejecución, y luego ejecutar ps normal con esa longitud del nombre de usuario

Alternativamente, si desea ps para ver como de costumbre para los nombres de usuario cortos (< = 8 caracteres), y no lo hace Tenga en cuenta que algunos nombres de usuario largos en la salida se desalinean con los encabezados, puede hacer algo como:

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

lo que hace es hacer la columna nombre de usuario de salida muy larga (-o user:40), y luego posprocesa la salida se recortan nombres de usuario tan largos (length $1 > 8) tienen un solo espacio entre ellos y la columna siguiente, y los nombres de usuario cortos (else {) volver al modo predeterminado (hasta 8 caracteres de nombre de usuario, y el resto hasta 9º carácter son espacios)

Cuestiones relacionadas