web-dev-qa-db-ja.com

「ps -u」は本当に悪い構文ですか?

IMHO ps -ups -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
:

に比べ

$ ps -u $USER
    PID TTY          TIME CMD
 234897 pts/2    00:00:00 run.sh
 234899 pts/2    1-22:44:04 Java
:
  1. しかし、なぜそれが「悪い構文」なのでしょうか? /usr/share/doc/procps-3.2.8/FAQはあまり役に立ちません。
  2. まったく同じ出力を実現するための「適切な構文」は何でしょうか?

重要な場合:

$ 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

正しい構文同じ出力を返すは次のようになります。

ps u

psの最新の構文が混乱しているのには十分な理由があります。歴史的に、互換性のないバージョンのpsが2つありました。先頭にダッシュが付いているオプションは、AT&T Unixバージョンのpsから継承されたものです。先頭にダッシュがないオプションは、BSDから継承されました。 Linuxディストリビューションが一般的に使用するpsのバージョンは、GNUで、両方のオプションのセットをマージし、先頭のdouble-で始まる独自のオプションのセットを追加しています。ダッシュ。

したがって、ps uはBSDスタイルであり、ps -u $USERはAT&Tスタイルです。 GNU psを使用するとps -uを実行でき、警告以外はps uと同じ出力が得られるという事実は、GNUは悪い状況を最大限に活用しようとしています。

131
John1024

psコマンドは、歴史的にBSDとSystem V Unixで非常に異なる構文を持っていました。

  • BSD ps では、uオプション(ダッシュなし)はパラメーターを取らず、追加の列とともに「ユーザー指向の出力」を表示します。

  • SunOS ps では、-uオプション(ダッシュ付き)はパラメーターとしてユーザー名を受け取り、そのユーザーが所有するプロセスのみを含みますが、表示形式は変更しません。

(別の非常に一般的な例として、BSD eは「環境を表示」を意味し、SunOS -eは、「全員のプロセスを表示する」を意味します。)

Linuxprocpsps は両方のスタイルをサポートしようとします。したがって、「ダッシュ」オプションを使用する場合、-u、拡張列オプションではなく、SunOSの「このユーザーをフィルタ」オプションではないと想定されます。 2つは頻繁に混同されますが、procpsが意図したことを実行しようとします–ユーザー名が欠落している場合、BSDオプションを指定したものの、SunOS構文を使用したと見なされます。

(実際にはpsには非常に多くの異なるバリアントがあり、procpsには「パーソナリティ」の実際のテーブルがあり、あいまいな動作を1つのスタイルまたは別のまたはさらに別の- "UNIX95"、 "CMD_ENV"、 "_ XPG"、 "I_WANT_A_BROKEN_PS" ...)のようなノブに加えて)

84
user1686