2011-09-16 12 views
21

ps -eafProcessi in esecuzione. Perché visualizzare il numero uid invece di username?

..

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 nomeutente2

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

Tutti gli utenti in LDAP (/etc/nsswitch.conf è corretto, tutto è corretto - ma solo l'utente non mostrano)

Perché visualizzato il numero UID (1466), invece nome utente?

+1

Forse perché i numeri UID hanno una lunghezza massima abbastanza prevedibile, mentre i nomi utente possono essere piuttosto lunghi? –

+10

Sì, è la lunghezza del nome utente (se è più lungo di 8 caratteri, allora 'ps aux' sostituirà l'uid per il nome). Esecuzione di 'man ps' ora per ottenere dettagli. –

risposta

35

C'è un limite di 8 caratteri per i nomi utente da elencare in ps -ef (POSIX) o ps aux (derivati ​​BSD). Explanation of options

Ho cercato pagine man su entrambi i Mac e Linux box e non ho visto quel limite registrato lì.

La domanda non appare regolarmente sul forum con il limite di 8 caratteri come la risposta.

ho fatto finalmente imbattersi in this page in cui è stato segnalato il "bug" contro Debian ma chiuso come non un bug. Essi fanno riferimento this page che rende anche un reclamo su come standard POSIX e UNIX richiedono cadendo di nuovo a uid quando i nomi sono troppo lunghi. Inoltre, non dallo standard POSIX attuale.

Non so se questo è autorevole, ma lo fa spiegare il comportamento si sta vedendo con un nome utente 9 caratteri. :)

Forse qualcun altro può inviare una risposta ad un legame più autorevole?

+0

'ps aux' è la normale sintassi BSD. La cosa che hai elencato come BSD è invece il vecchio systax di SysV. – tchrist

+0

Oops indietro. Grazie @ pst. Fisso. –

11

Come indicato da Ray Toal, è limitato a un limite di 8 caratteri. Questo non è un bug ma parte dello standard di nuovo come menzionato da Ray. Se si controlla il codice sorgente di ps (parte di procps pacchetto) uno dei commenti 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 

Se si seleziona la link nella sezione STDOUT si dice che i campi (utente, ruser , gruppo, rgroup) verrà stampato se è possibile ottenerlo e se la larghezza del campo lo consente oppure se la rappresentazione decimale è diversa.
Il motivo per cui le larghezze del campo del nome gruppo utente & sono limitate a 8 potrebbe essere per legacy support ma questa è solo un'ipotesi.

3

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

L'opzione -o è usata per specificare un utente formato definito per l'output del comando ps.

Il formato definito dall'utente specificato indica l'output dei campi utente, pid, ppid, stime, tname, ora e cmd.

cut -d: -f1 /etc/passwd | wc -L determina il numero di caratteri nel nome di accesso più lungo nel file di password. Pertanto, user:$(cut -d: -f1 /etc/passwd | wc -L) indica al comando ps di emettere il campo utente utilizzando la lunghezza massima del nome di accesso più lungo.

+0

potresti aggiungere alcune informazioni aggiuntive su ciò che sta facendo il comando? – dmportella

0

Per un output di lunghezza ancora più dinamico della risposta di moosaka (ad esempio, se si hanno pochi nomi utente molto lunghi, ma che vengono utilizzati molto raramente e non si desidera che lo schermo venga perso la maggior parte del tempo), è possibile utilizzare:

ps utente -eo: $ (ps axho uid | sort -u | xargs getent passwd | taglio -f1 -d: | wc -L), pid, PPID, c, STIME, TNAME, tempo, cmd

Essa renderà la lunghezza della colonna nome utente il tempo più lungo del nome utente più lungo del processo attualmente in esecuzione. Tuttavia, se il nuovo processo con un nome utente più lungo inizia in una frazione di secondo mentre il comando è in esecuzione, è ancora possibile visualizzare un numero, ma per il 99,99% delle volte è molto più bello)

spiegazione: $(ps axho uid [...] | wc -L) calcola la lunghezza massima del nome utente del processo attualmente in esecuzione, e poi eseguire il normale ps con quella lunghezza del nome utente

in alternativa, se si vuole ps a guardare come al solito per i nomi utente breve (< = 8 caratteri), e non fare mente per pochi nomi utente lunghi in uscita per essere disallineati con le intestazioni, puoi fare qualcosa come:

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

cosa che fa è rendere colonna nome utente uscita molto lungo (-o user:40), e quindi postprocesses l'uscita così lunghi nomi utente (length $1 > 8) presentano solo uno spazio tra loro e colonna successiva, e nomi utente brevi (else {) vengono tagliate torna al valore predefinito (fino a 8 caratteri nome utente e il resto fino al 9 carattere sono spazi)

Problemi correlati