web-dev-qa-db-fra.com

"Ps -u" est-il vraiment une syntaxe incorrecte?

IMHO ps -u affiche une sortie très utile, bien meilleure que ps -u $USER:

$ ps -u
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
elastic   234897  0.0  0.0 105980  1336 pts/2    S+   Oct10   0:00 /bin/bash ./run.sh collector-json-1.conf
elastic   234899 48.7  7.1 10087120 4433104 pts/2 Sl+ Oct10 2804:11 /usr/Java/jdk1.7.0_09_x64/bin/Java -Xmx6144m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatin
:

par rapport à

$ ps -u $USER
    PID TTY          TIME CMD
 234897 pts/2    00:00:00 run.sh
 234899 pts/2    1-22:44:04 Java
:
  1. Mais pourquoi est-ce une "mauvaise syntaxe"? /usr/share/doc/procps-3.2.8/FAQ n'aide pas beaucoup.
  2. Quelle serait une "syntaxe correcte" pour obtenir exactement le même résultat?

Dans le cas où c'est important:

$ uname -a
Linux h22k34.local 2.6.32-042stab044.17 #1 SMP Fri Jan 13 12:53:58 MSK 2012 x86_64 x86_64 x86_64 GNU/Linux
75
sjngm

La syntaxe correcte qui renvoie le même résultat serait:

ps u

Il y a une bonne raison pour laquelle la syntaxe moderne pour ps est un gâchis. Historiquement, il existait deux versions incompatibles de ps. Les options avec un tiret principal ont été héritées de la version Unix d'AT & T de ps. Les options sans tiret principal ont été héritées de BSD. La version de ps généralement utilisée par les distributions Linux est GNU, qui a fusionné les deux jeux d’options et ajouté son propre jeu d’options commençant par un double tiret.

Ainsi, ps u est de style BSD et ps -u $USER de style AT & T. Le fait que GNU ps vous permette d’exécuter ps -u et, à l’exception de l’avertissement, d'obtenir le même résultat que ps u montre que GNU tente de tirer le meilleur parti d’une mauvaise situation.

130
John1024

La commande ps avait historiquement une syntaxe très différente dans BSD et System V Unix.

  • Dans BSD ps , l'option u (aucun tiret) ne prend aucun paramètre et affiche la "sortie orientée utilisateur" avec les colonnes supplémentaires.

  • Dans SunOS ps , l'option -u (avec un tiret) prend un nom d'utilisateur en tant que paramètre et n'inclut que les processus détenus par cet utilisateur, mais sans changer le format d'affichage.

(Comme autre exemple très courant, BSD e signifie "show environment", alors que SunOS -e signifie "affiche les processus de tout le monde".)

Linux procps ps essaie de prendre en charge les deux styles. Donc, si vous utilisez l'option 'tiret' -u, vous vous attendez à ce qu'elle soit l'option "Filtrez cet utilisateur" de SunOS, et non à l'option des colonnes étendues. Les deux confondent assez souvent cependant que procps essaie de faire ce que vous vouliez dire - si le nom d'utilisateur est manquant, cela suppose que vous lui avez donné une option BSD mais que vous avez utilisé la syntaxe SunOS .

(Il y avait en fait tellement de variantes différentes de ps que le procps possède un tableau réel de "personnalités" pour forcer un comportement ambigu à être interprété comme un style ou un autre ou encore un autre - en plus de boutons tels que "UNIX95", "CMD_ENV", "_XPG", "I_WANT_A_BROKEN_PS" ...)

84
grawity