ps: obtém o nome do comando curto e o tempo decorrido

2

Eu estou em um sistema Debian 8 tentando determinar os processos e seu respectivo tempo de execução de um determinado usuário:

$ ps -u <user>
  PID TTY          TIME CMD
26038 ?        00:00:00 php5-fpm
26052 ?        00:00:00 php5-fpm
26950 ?        00:00:00 php5-fpm
27344 ?        00:00:00 php5-fpm
28292 ?        00:00:00 php5-fpm
28691 ?        01:54:21 python3 /usr/lo
$ which ps  # ps is not aliased or so.
/bin/ps

Agora eu adicionalmente quero o tempo decorrido para os respectivos processos. Então eu tentei:

$ ps -o cmd=,etime= -u <user>
php-fpm: pool <user>         00:36
php-fpm: pool <user>         00:36
php-fpm: pool <user>         00:24
php-fpm: pool <user>         00:18
php-fpm: pool <user>         00:04
python3 /usr/local/bin/fixw    17:39:44

No entanto, quero ter os nomes abreviados do processo php-fpm como na primeira saída, não os nomes longos da segunda. Não consegui encontrar nenhuma maneira de fazê-lo, lendo a man page de ps .
Como obtenho o CMD da saída # 1 com o tempo decorrido da saída # 2?

Solução A resposta de @ StephenKitt foi a dica que faltava. No entanto, precisei modificá-lo um pouco. Saída estranha:

$ ps -o comm=,etime= -u <user>
,etime=
php5-fpm
php5-fpm
php5-fpm
php5-fpm
php5-fpm
ps
python3 /usr/lo

Opções separadas funcionam:

$ ps -o comm= -o etime= -u <user>
php5-fpm              00:55
php5-fpm              00:27
php5-fpm              00:24
php5-fpm              00:13
php5-fpm              00:08
python3 /usr/lo    17:49:38
    
por Richard Neumann 19.06.2018 / 09:59

1 resposta

2

Apesar do nome da coluna, a saída que você está procurando é comm , em vez de cmd :

ps -o comm= -o etime= -u <user>

cmd é um alias não padrão para args e mostra o comando com todos os seus argumentos, incluindo quaisquer modificações que o processo tenha feito.

comm é o nome do processo que no Linux por padrão são os primeiros 15 bytes do nome base do último arquivo que o processo executou (ou é o mesmo nome que o seu processo pai se não executou nenhum arquivo ou o nome da tarefa para tarefas do kernel) e pode ser modificado com PR_SET_NAME prctl() .

Observe que etime é o tempo decorrido desde que o processo foi gerado e um processo pode (e geralmente executa) mais de um comando durante sua vida útil, portanto, se você vir cmd 00:03 , isso não necessariamente significa que cmd foi executado por 3 segundos, o processo que está atualmente executando cmd poderia muito bem ter executado algum outro comando antes.

$ sh -c 'sleep 3; exec ps -o comm= -o etime='
zsh                   13:48
ps                    00:03

O processo executando ps estava executando anteriormente sh , durante o qual ele passou a maior parte do tempo aguardando outro processo executando sleep (depois de executar sh por um tempo muito curto).

    
por 19.06.2018 / 10:00