Por que “ps -p proc1 proc2 proc3” mostra “-csh”, “-tcsh” e “- / bin / tcsh”, enquanto que “ps -p proc [n]” individualmente todos dizem “tcsh”?

1

Eu uso tcsh (não csh) e executei pgrep csh | xargs ps -p para ver porque eu parecia estar executando o csh. Uma parte dos resultados:

 1529 pts/0    Ss     0:00 -csh
 1764 pts/3    Ss     0:00 -tcsh
 1979 pts/4    Ss+    0:00 -bin/tcsh

Eu então fiz ps -p 1529 1764 1979 e obtive a mesma coisa:

  PID TTY      STAT   TIME COMMAND
 1529 pts/0    Ss     0:00 -csh
 1764 pts/3    Ss     0:00 -tcsh
 1979 pts/4    Ss+    0:00 -bin/tcsh

Então eu fiz ps -p 1529; ps -p 1764; ps -p 1979

  PID TTY          TIME CMD
 1529 pts/0    00:00:00 tcsh
  PID TTY          TIME CMD
 1764 pts/3    00:00:00 tcsh
  PID TTY          TIME CMD
 1979 pts/4    00:00:00 tcsh

ps --version fornece procps-ng version 3.3.10 e tcsh --version yields tcsh 6.19.00 (Astron) 2015-05-21 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec .

Por que esse comportamento estranho? Estou tentando escrever um monitor de processo, e ter o tcsh assumindo três formas diferentes é chato.

    
por barrycarter 27.11.2016 / 03:56

2 respostas

0

Você está comparando dois campos diferentes.

Observe as linhas de cabeçalho. Aquele com os traços tem COMMAND , enquanto aquele com tcsh tem CMD . Veja a seção Especificadores de formato padrão do man 1 ps página man.

Essencialmente:

  • cmd ( CMD ) é o comando com todos os seus argumentos como uma string.

  • comm ( COMMAND ) é o nome do executável que o processo está executando.

No Linux, o último também pode ser definido usando prctl(PR_SET_NAME, string) para todo o processo e com pthread_setname_np(thread, string) para um encadeamento individual. string está limitado a 16 caracteres.

Os shells rotineiramente definem seu nome com base no symlink ou no modo em que foram executados, para que a lista de processos pareça logicamente correta. Em particular, iniciar o nome com um traço (como em -tcsh ) é usado para indicar um shell login .

No caso do OP, existem três shells executando o binário tcsh shell, todos os três como shells de login , mas um deles está no modo csh .

Um shell de login é apenas um shell em um certo modo interativo; o shell se comportando de maneira ligeiramente diferente de um que diz executar um script. Considere-o um modo que tem sinos e assobios para tornar o uso de shell mais fácil para os humanos, que os scripts não precisam.

O OP quase certamente tem csh alias para tcsh , e os três shells foram iniciados usando tcsh -l , csh -l e bin/tcsh -l , respectivamente. Para descobrir qual binário real um comando inicia, use realpath $(which command) .

    
por 27.11.2016 / 18:06
0

Esta é uma peculiaridade do comando ps do Linux. Ele tenta emular o comportamento de ps de várias variantes do Unix e adivinha a variante com base nas opções que você passa. Isso é descrito como "personalidade" na página do manual .

Dependendo da variante estimada, o conjunto padrão de campos de saída é diferente. Na personalidade do Linux, ps mostra as colunas pid ("PID"), tty ("TTY"), time ("TIME") e args ("CMD"). Na personalidade do BSD, ps mostra pid “PID”, tty “TTY”, stat “STAT”, tempo “TIME” and comm “COMMAND”. ps -p 1529 is (historically) System V syntax, and in that case Linux chooses the Linux personality. ps -p 1529 1764 1979 has the -p option with the argument 1529 , and two more arguments 1764 and 1979 (they're argument to ps itself, not to the -p option). With a process ID as argument, ps chooses the BSD output format. You get the same with ps 1529 '.

A diferença entre a coluna args (alias command , cabeçalho “CMD”) e a coluna comm (cabeçalho “COMMAND”) é que o CMD mostra a linha de comando com todos os argumentos separados por espaços (possivelmente truncados ), enquanto COMMAND mostra apenas o nome do executável. O primeiro argumento (número de argumento 0) na linha de comando de um programa é normalmente o nome do executável, por convenção. No entanto, quando um shell é invocado como um shell de login, o argumento 0 tem um traço ( - ) como um prefixo - é assim que um shell descobre que deve agir como um shell de login. Neste tópico, consulte Diferença entre o Shell de Login e o Shell de Não Login ? e Por que não podemos ver um único hífen de $ 0 em um shell de login invocado com a opção '--login'?

Quanto à aparência de csh em oposição a tcsh , isso significa que você executou csh em algum lugar. Você pode não ter notado se csh é apenas um simbólico para tcsh .

    
por 28.11.2016 / 02:20

Tags