Est-ce que “ps -u” est vraiment une syntaxe incorrecte?

75

IMHO ps -uaffiche un résultat très utile, bien meilleur 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/FAQn'aide pas beaucoup.
  2. Quelle serait une "syntaxe correcte" pour obtenir exactement le même résultat?

Si 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
sjngm
la source
5
Et maintenant, la partie difficile: quelle réponse devrait être cochée?
sjngm
En fait, je pensais que je devais laisser les utilisateurs décider. Celui qui a les votes les plus élevés devrait l'obtenir. Mais vous ne facilitez pas les
choses
6
lorsque les deux réponses sont égales, je vote à la fois vers le haut et coche la case en faveur de l'utilisateur dont la représentation est la plus basse, en particulier lorsque la différence est supérieure à 100k.
Frank Thomas
1
@FrankThomas fait :)
sjngm
Sur les systèmes basés sur SysV (ou ceux qui psproviennent de cette catégorie d’activités), j’utilise fréquemment ps -fu $USER... le ps -fformatage en sortie qui est un peu similaire au ps uformatage, tout en obtenant également le paramètre spécifier-un-utilisateur. Au cas où vous vouliez les deux en même temps.
lindes-hw

Réponses:

130

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

ps u

Il y a une bonne raison pour laquelle la syntaxe moderne psest un désordre. Historiquement, il existait deux versions incompatibles de ps. Les options avec un tiret principal ont été héritées de la version AT & T Unix de ps. Les options sans tiret principal ont été héritées de BSD. La version psgé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 ustyle BSD et style ps -u $USERAT & T. Le fait que GNU psvous permette d’exécuter ps -uet, en plus de l’avertissement, d’obtenir le même résultat ps u, ce qui montre que GNU tente de tirer le meilleur parti d’une mauvaise situation.

John1024
la source
En fait, il n'y a pas de bonne raison pour le désordre. Il en existe plusieurs mauvais et la prétendue dichotomie de "GNU" et "BSD" est une erreur proposée par une page de manuel Linux. Voir unix.stackexchange.com/a/511530/5132 .
JdeBP
84

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

  • Dans BSDps , l' uoption (pas de tiret) ne prend aucun paramètre et affiche la "sortie orientée utilisateur" avec les colonnes supplémentaires.

  • Dans SunOSps , l' -uoption (avec tiret) prend un nom d'utilisateur en tant que paramètre et n'inclut que les processus appartenant à cet utilisateur, mais sans changer le format d'affichage.

(Comme autre exemple très courant, BSD esignifie "show environment", tandis que SunOS -esignifie "affichez les processus de tout le monde".)

Linux procps ps essaie de supporter les deux styles. Donc, si vous utilisez l'option "tiret" -u, vous vous attendez à ce qu'elle soit l'option "filtrer cet utilisateur" de SunOS, pas l'option à colonnes étendues. Cependant, 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 psque le procps dispose d'un tableau réel de "personnalités" pour forcer un comportement ambigu à être interprété comme un style ou un autre encore - en plus des boutons comme "UNIX95", "CMD_ENV", "_XPG", "I_WANT_A_BROKEN_PS" ...)

Grawity
la source
29
"I_WANT_A_BROKEN_PS" hah.
42
... Au début, je pensais que c'était une blague. Mais nooooo ...
Izkata,
9
Hmm, il s’avère que c’est exactement la possibilité de masquer "l’utilisation ambiguë" des avertissements que voit OP.
Grawity