75

ИМХО ps -u показывает очень полезный вывод, намного лучше, чем 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
:

по сравнению с

$ 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

2 ответа2

130

Правильный синтаксис, который возвращает тот же вывод, будет:

ps u

Есть веская причина, почему современный синтаксис для ps - беспорядок. Исторически существовали две несовместимые версии ps . Опции с начальным тире были унаследованы от версии ps AT & T Unix. Опции без передней черты были унаследованы от BSD. Версия ps которую обычно используют дистрибутивы Linux, - это GNU, которая объединила оба набора параметров, а также добавила свой собственный набор параметров, которые начинаются с лидирующей двойной тире.

Таким образом, ps u в стиле BSD, а ps -u $USER стиле AT & T. Тот факт, что GNU ps позволяет вам запускать ps -u и, кроме предупреждения, получать тот же вывод, что и ps u показывает, что GNU пытается извлечь максимум из плохой ситуации.

84

У команды ps исторически был совершенно другой синтаксис в BSD и System V Unix.

  • В BSD ps опция u (без тире) не принимает параметров и показывает «ориентированный на пользователя вывод» с дополнительными столбцами.

  • В SunOS ps опция -u (с тире) принимает имя пользователя в качестве параметра и включает только процессы, принадлежащие этому пользователю, но без изменения формата отображения.

(В качестве другого очень распространенного примера, BSD e означает "показать среду", в то время как SunOS -e означает "показать процессы каждого".)

Linux procps ps пытается поддерживать оба стиля. Так что, если вы используете опцию 'dash' -u , она будет ожидать, что это SunOS "отфильтровать этого пользователя", а не опция расширенных столбцов. Однако они часто путаются, так что procps пытается сделать то, что вы имели в виду - если имя пользователя отсутствует, оно будет предполагать, что вы задали ему опцию BSD, но использовали синтаксис SunOS.

(На самом деле было так много разных вариантов ps что у procps есть фактическая таблица "личности", чтобы заставить неоднозначное поведение интерпретироваться как тот или иной стиль или еще один - в дополнение к ручкам типа "UNIX95", "CMD_ENV" , "_XPG", "I_WANT_A_BROKEN_PS" ...)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .