76 votes

Est-ce que "ps -u" est vraiment une mauvaise syntaxe ?

IMHO ps -u montre 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 la "syntaxe appropriée" pour obtenir exactement le même résultat ?

Au 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

131voto

John1024 Points 15663

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

ps u

Ce n'est pas sans raison que la syntaxe moderne de l'outil ps est un désordre. Historiquement, il y avait deux versions incompatibles de ps . Les options avec un tiret en tête ont été héritées de la version AT&T Unix de l'option ps . Les options sans tiret de tête ont été héritées de BSD. La version de ps que les distributions Linux utilisent généralement est GNU, qui a fusionné les deux ensembles d'options, tout en ajoutant son propre ensemble d'options qui commencent par un double tiret.

Ainsi, ps u est de type BSD et ps -u $USER est du style AT&T. Le fait que GNU ps vous permet d'exécuter ps -u et, à part l'avertissement, j'obtiens le même résultat que ps u montre que GNU essaie de tirer le meilleur parti d'une mauvaise situation.

85voto

James Mertz Points 390

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

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

  • Sur SunOS ps le -u L'option (avec tiret) prend un nom d'utilisateur comme paramètre et n'inclut que les processus appartenant à cet utilisateur, mais sans changer le format d'affichage.

(Autre exemple très courant, BSD e signifie "montrer l'environnement", tandis que SunOS -e signifie "montrer les processus de chacun").

Linux procps ps essaie de soutenir les deux styles. Ainsi, si vous utilisez l'option "dash -u il s'attendra à ce que ce soit l'option SunOS "filter this user", pas l'option colonnes étendues. La confusion entre les deux est cependant assez fréquente pour que l'on ne puisse pas se permettre de les confondre. procps essaie de faire ce que vous vouliez - si le nom d'utilisateur est manquant, il supposera 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 dispose d'un véritable tableau de "personnalités" pour forcer un comportement ambigu à être interprété comme un style ou un autre ou encore un autre - en plus de des boutons comme "UNIX95", "CMD_ENV", "_XPG", "I_WANT_A_BROKEN_PS"...)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X