Adiciona o campo sid à saída ps -f

2

Estou lendo a página de manual do ps e há algo que não entendo.

-f    does full-format listing. This option can be combined with many other
      UNIX-style options to add additional columns. It also causes the
      command arguments to be printed. When used with -L, the NLWP (number of 
      threads) and LWP (thread ID) columns will be added. See the c option,
      the format keyword args, and the format keyword comm.

Eu só quero adicionar sid à saída de ps -f

Mas fiquei confuso com a saída a seguir, meu entendimento é -o deveria apenas adicionar sid à saída de -f , mas parece que -o sobrescreve -f completamente.

Eu sei que posso especificar todas as opções que eu quero, como pid,ppid,pgid,sid,user,comm etc etc, mas existe uma maneira apenas adicionar uma coluna adicional à saída de -f ? É o que diz a página man, correto?

[njia@cst-cgxfile01 ~]$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
njia      3397 26106  0 12:23 pts/1    00:00:00 ps -f
njia     26106 26105  0 09:45 pts/1    00:00:00 -bash
[njia@ ~]$ ps -f -o sid
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
  SID
26106
26106
25875
25875
25875
25875
25875
[njia@ ~]$

Além disso, ps -ef -o sid limitará a seleção do processo aos que pertencem a mim, o que também foi uma surpresa.

    
por Ask and Learn 11.02.2014 / 02:32

2 respostas

2

Para responder à primeira parte da sua pergunta, existem vários sinalizadores que você pode adicionar ao -f . Eles incluem -l , -j , -m e -L . Infelizmente -o <format> não pode ser combinado com -f .

De fato, a melhor maneira de obter exatamente o que você deseja é especificar exatamente o que você deseja, por exemplo,

ps -e -o pid,ppid,pgid,sid,user,comm

Mas você pode fechar adicionando -j a -f para criar ps -efj . Isso adiciona as colunas PGID e SID .

Demonstrando sem o sinalizador -e para tornar a saída mais curta, compare:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
myuser     123  4513  0 18:20 pts/26   00:00:00 zsh
myuser     1282  123  0 18:20 pts/26   00:00:00 ps -f

$ ps -fj
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
myuser     123  4513   123   123  0 18:20 pts/26   00:00:00 zsh
myuser     1402  123  1402   123  0 18:20 pts/26   00:00:00 ps -fj

Para responder à segunda parte da sua pergunta, a razão ps -ef -o sid mostra apenas seus próprios processos, ela muda para o modo BSD quando decide que suas flags não eram compatíveis com POSIX. Isso é indicado pela mensagem

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

Então, é equivalente a executar ps ef o sid .

No modo BSD, e significa que o ambiente do processo será impresso e f significa "floresta". E o modo BSD é padronizado para imprimir todos os processos pertencentes ao usuário atual que tenham qualquer terminal , não apenas aqueles no terminal atual.

Tente alterar o -o sid para -o sid,cmd para ver os efeitos das opções e e f .

$ ps ef o sid
SID
12345
  567
  567
...

$ ps ef o sid,cmd
  SID CMD
12345 -zsh USER=... LOGNAME=...
  567 zsh PWD=... LANG=...
  567  \_ ps ef o sid,cmd LANG=... PWD=...
...

E compare com ps u para ver que os processos mostrados são os mesmos (acrescentei | wc -l para brevidade).

$ ps ef o cmd | wc -l
20
$ ps u | wc -l
20
    
por 11.02.2014 / 03:15
2

Tudo o que você declara está correto, ps listará apenas os processos de sua propriedade, a menos que você diga de outra forma com x ou a ou opções semelhantes. -o define o formato, não é cumulativo. Então, para obter a saída de ps -f com SID adicionado, você precisará especificar a coisa toda usando -o :

$ ps -f 
UID        PID  PPID  C STIME TTY          TIME CMD
terdon   27452 27436  0 02:48 pts/3    00:00:00 /bin/bash
terdon   30622 27452  0 02:51 pts/3    00:00:00 ps -f
$ ps -o user,pid,sid,ppid,c,stime,tty,time,cmd
USER       PID   SID  PPID  C STIME TT           TIME CMD
terdon   27452 27452 27436  0 02:48 pts/3    00:00:00 /bin/bash
terdon   30905 27452 27452  0 02:51 pts/3    00:00:00 ps -o user,pid,sid,ppid,c,stime,tty,time,cmd

Para obter o mesmo resultado para todos os usuários, use:

ps -axo user,pid,sid,ppid,c,stime,tty,time,cmd

O mais próximo que você pode chegar de adicionar ao invés de sobrescrever o formato de saída é usar -O (é O como em Oliver, não 0 ):

-O format
    Like -o, but preloaded with some default columns.  
    Identical to -o pid,format,state,tname,time,command or
                 -o pid,format,tname,time,cmd

Então, por exemplo:

$ ps -O sid
  PID   SID S TTY          TIME COMMAND
 4879 27452 R pts/3    00:00:00 ps -O sid
27452 27452 S pts/3    00:00:00 /bin/bash
    
por 11.02.2014 / 02:57

Tags