É “ps -u” Realmente uma sintaxe ruim?

75

IMHO ps -u mostra uma saída muito útil, muito melhor 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
:

comparado a

$ ps -u $USER
    PID TTY          TIME CMD
 234897 pts/2    00:00:00 run.sh
 234899 pts/2    1-22:44:04 java
:
  1. Mas, por que é uma "sintaxe ruim"? /usr/share/doc/procps-3.2.8/FAQ não ajuda muito.
  2. O que seria uma "sintaxe adequada" para alcançar exatamente a mesma saída?

Caso seja importante:

$ 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
    
por sjngm 14.10.2014 / 08:49

2 respostas

130

A sintaxe correta, que retorna a mesma saída , seria:

ps u

Existe uma boa razão pela qual a sintaxe moderna para ps é uma bagunça. Historicamente, havia duas versões incompatíveis de ps . As opções com um traço principal foram herdadas da versão AT & T Unix de ps . Opções sem um traço principal foram herdadas do BSD. A versão de ps que as distribuições Linux geralmente usam é o GNU, que uniu os dois conjuntos de opções, além de adicionar seu próprio conjunto de opções que começam com um traço duplo principal.

Assim, ps u é do tipo BSD e ps -u $USER é AT & T-style. O fato de que o GNU ps permite executar ps -u e, além do aviso, obter a mesma saída que ps u mostra que o GNU está tentando tirar o melhor de uma situação ruim.

    
por 14.10.2014 / 08:54
84

O comando ps historicamente tinha uma sintaxe bastante diferente no BSD e no System V Unix.

  • Em BSD ps , o u option (sem traço) não recebe nenhum parâmetro e mostra a "saída orientada para o usuário" com as colunas adicionais.

  • Em SunOS ps , a opção -u (com traço) usa um nome de usuário como parâmetro e inclui apenas processos pertencentes a esse usuário, mas sem alterar o formato de exibição.

(Como outro exemplo muito comum, o BSD e significa "mostrar ambiente", enquanto o SunOS -e significa "mostrar todos os processos".)

O Linux procps ps tenta suportar os dois estilos. Portanto, se você usar a opção 'traço' -u , ela esperará que seja a opção 'filtrar este usuário' do SunOS, não a opção de colunas estendidas. Os dois estão confusos com bastante frequência, no entanto, que procps tenta fazer o que você quis dizer - se o nome de usuário estiver faltando, ele assumirá que você deu a opção BSD, mas usou a sintaxe SunOS.

(Na verdade, havia tantas variantes diferentes de ps que o procps tem uma tabela real de "personalidades" para forçar um comportamento ambíguo a ser interpretado como um ou outro estilo ou outro - além de knobs como "UNIX95", "CMD_ENV", "_XPG", "I_WANT_A_BROKEN_PS" ...)

    
por 14.10.2014 / 09:04

Tags