web-dev-qa-db-fra.com

Processus en cours. Pourquoi affiché le numéro d'utilisateur plutôt que le nom d'utilisateur?

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 nom d'utilisateur2

uid = 1466 (nom d'utilisateur2) gid = 513 (DomainUsers) groupes = 513 (DomainUsers)

Tous les utilisateurs de LDAP (/etc/nsswitch.conf est correct, tout est correct - mais seul cet utilisateur ne s'affiche pas)

Pourquoi affiché le numéro d'utilisateur (1466) à la place du nom d'utilisateur?

25
Anton Shevtsov

Il existe une limite de 8 caractères pour que les noms d'utilisateur soient listés dans ps -ef (POSIX) ou ps aux (dérivés BSD). Explication des options

J'ai cherché des pages de manuel sur les ordinateurs Mac et Linux et je n'ai pas vu cette limite enregistrée là-bas.

La question apparaît régulièrement sur les forums avec la limite de 8 caractères.

Je Est-ce que est finalement tombé sur cette page dans laquelle le "bogue" a été rapporté contre Debian mais fermé comme étant pas un bogue Ils font référence à cette page , qui affirme également que les normes POSIX et UNIX exigent le recours aux uids lorsque les noms sont trop longs. Pas non plus du standard POSIX actuel.

Je ne sais pas si cela fait autorité, mais cela explique le comportement que vous observez avec un nom d'utilisateur à 9 caractères. :)

Peut-être que quelqu'un d'autre peut poster une réponse à un lien plus fiable?

38
Ray Toal

Comme Ray Toal le mentionne, il est limité à 8 caractères. Ce n'est pas un bug mais une partie de la norme à nouveau comme mentionné par Ray. Si vous vérifiez le code source de ps (partie du paquet procps), l’un des commentaires dit

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 vous cochez la case link dans la section STDOUT, cela indique que les champs (user, ruser, group, rgroup) seront imprimé s'il est possible de l'obtenir et si la largeur du champ le permet, ou une représentation décimale sinon.
La raison pour laquelle la largeur des champs de noms d'utilisateurs et de groupes est limitée à 8 pourrait être due à support hérité mais ce n'est qu'une supposition. 

11
another.anon.coward

Pour une longueur encore plus dynamique que la réponse de moosaka (par exemple, si vous avez peu de noms d'utilisateurs très longs, mais qui sont très rarement utilisés et que vous ne voulez pas que l'écran soit gaspillé la plupart du temps), vous pouvez utiliser:

ps -eo utilisateur: $ (ps axho uid | sort -u | xargs getent passewd | cut -f1 -d: | wc -L), pid, ppid, c, temps, nom, heure, cmd

Cela fera la longueur de la colonne de nom d'utilisateur aussi longtemps que le nom d'utilisateur le plus long du processus en cours d'exécution. (Notez que ce n'est pas pareil, cependant, et si un nouveau processus avec un nom d'utilisateur plus long commence dans la fraction de seconde lorsque la commande est en cours d'exécution, vous pouvez toujours afficher un numéro. Mais pour 99,99% du temps, la sortie est bien meilleure)

Explication: $(ps axho uid [...] | wc -L) calcule la longueur maximale du nom d'utilisateur du processus en cours d'exécution, puis exécute le ps normal avec cette longueur de nom d'utilisateur

Alternativement, si vous voulez que ps apparaisse comme d'habitude pour les noms d'utilisateur courts (<= 8 caractères), et que peu de noms d'utilisateur longs en sortie soient mal alignés avec les en-têtes, vous pouvez faire quelque chose comme:

ps ax -o utilisateur: 40, pid, ppid, c, stime, tname, time, cmd | Perl -pe 'if (/ ^ (\ S +)/et longueur $ 1> 8) {s/^ (\ S +)\s +/$ 1 /} sinon {s/^ (. {9})\s +/$ 1 /} '

ce qui fait que la colonne nom_utilisateur de sortie est très longue (-o user:40), puis post-traite la sortie si longtemps que les noms d'utilisateur (length $1 > 8) ont juste un espace entre eux et la colonne suivante, et que les noms d'utilisateur courts (else {) sont ramenés à leur valeur par défaut (jusqu'à 8). Caract username, et le reste jusqu'au 9ème caractère sont des espaces)

0
Matija Nalis