Comando top -c no linux para filtrar os processos listados com base no nome do processo

149
top -c

Top lista todos os processos, existem boas opções para filtrar os processos por nome de usuário usando a opção -u, mas eu estou imaginando se existe alguma maneira fácil de filtrar os processos com base no nome do processo listado na coluna COMMAND da saída superior.

Por exemplo, eu gostaria da top -some option -substring of processname e top exibe pids apenas com essa substring em seu nome de comando

alex
fonte

Respostas:

214

Usando o pgrep para obter pid's de linhas de comando correspondentes:

top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line)

top -pespera uma lista de pids separados por vírgula, para que possamos usá-lo -d','no pgrep. A -fflag no pgrep faz com que ele corresponda à linha de comando, em vez do nome do programa.

perreal
fonte
12
lembre-se de que, se novos processos forem gerados para 'string_to_match_in_cmd_line', eles não aparecerão no topo; você teria que parar superior e re-executar este comando
eugenevd
1
Como disse eugenevd, isso não funcionará para novos processos iniciados após o início da chamada. Existe alguma maneira de fazer isso? Eu preciso executar vários programas com o mesmo prefixo em seu nome e gostaria de ver quantos deles estão sendo executados ao vivo, sem a necessidade de executar um novo top (ou apenas um ps) todas as vezes.
Jester
1
@ Jester, eugenevd, tive o mesmo problema que você. Criei uma nova versão em stackoverflow.com/a/27653841/681830 , espero que ajude.
Val
5
Eu encontrei top: pid limit (20) exceededentão eu usei isso: top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01 29/11
115

Isso pode ser feito interativamente

Depois de correr top -c, pressioneo e grave um filtro em uma coluna, por exemplo, para mostrar linhas em que a coluna COMMAND contém a string foo, writeCOMMAND=foo

Se você quer apenas uma saída básica, isso pode ser suficiente:

top -bc |grep name_of_process
n
fonte
7
Isso me dá 'opção ou sintaxe inválida: -bc'
shmim 16/05
3
top -bc -n 1 é mais conveniente, uma vez que limita o número de iterações para 1.
galath
1
Essa deve ser a resposta aceita. É mais preciso e funciona apenas com as opções fornecidas pelo comando 'top'. E mostra novos processos.
Abraham TS
Os processos continuam desaparecendo e reaparecendo com top -c , hit o and write a filter on a column.
MrR 7/11
92

Você pode adicionar filtros topenquanto estiver em execução, basta pressionar a otecla e digitar uma expressão de filtro. Por exemplo, para monitorar todos os processos java, use a expressão de filtro COMMAND=java. Você pode adicionar vários filtros pressionando a tecla novamente, pode filtrar por usuário com a utecla e pode limpar todos os filtros com a =tecla.

Don Kirkby
fonte
2
Esta é uma solução melhor do que a resposta aceita (essa solução foi apresentada três anos depois que a original). Ao contrário do original, esta solução também funciona em processos recém-gerados. Muito importante se você estiver monitorando processos Apache criados sob demanda.
Nate Lampton
2
Na verdade, uma solução melhor porque filtra ao vivo. A solução aceita resolve os IDs do processo antes de executar o topo. O processo resultante é como o top -c -p 920,1345,1346que é fixo.
Jérôme Gillard
4
O uso ocomo filtro não existe em algumas versões (mais antigas) da parte superior: top: procps version 3.2.8O filtro do usuário existe, portanto funciona.
Manwe
13

O comando do @ perreal funciona muito bem! Se você esquecer, tente em duas etapas ...

exemplo: parte superior do filtro para exibir apenas o aplicativo chamado yakuake:

$ pgrep yakuake
1755

$ top -p 1755

comandos interativos superiores úteis 'c': alterna o caminho completo vs. o nome do comando 'k': mata pelo PID 'F': filtre por ... selecione com as setas ... pressione 's' para definir a classificação

a resposta abaixo também é boa ... Eu estava procurando por isso hoje, mas não consegui encontrá-lo. obrigado

BBW Antes do Windows
fonte
7

Depois de procurar tantas respostas no StackOverflow, não vi uma resposta para atender às minhas necessidades.

Ou seja, para fazer com que o comando top continue atualizado com a palavra-chave fornecida, não precisamos CTRL + C / top repetidamente quando novos processos surgirem.

Assim eu faço um novo ...

Aqui está a versão sem necessidade de reinicialização.

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; sleep 1; done;)

Modifique a __keyword e ela deve funcionar. (Ubuntu 2.6.38 testado)

2.14.2015 adicionado: a parte da carga de trabalho do sistema está ausente com o código acima. Para pessoas que se preocupam com a parte "carga média":

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; uptime; sleep 1; done;)
Val
fonte
falta uma visão geral sobre a carga de trabalho do sistema. adicione "tempo de atividade" antes de dormir, para listas curtas de processos, isso é suficiente IMHO.
Sevyls
1
@Sevyls Obrigado por apontar! Após outras tentativas (que não funcionam tão bem quanto), sua versão pode ser uma das melhores. Resposta modificada.
Val
Funciona muito bem se eu tiver um ou mais processos em execução nessa correspondência, mas eu recebo um "top: usuário inválido" quando todos param. Ele se recupera quando outro processo é iniciado. Estou rodando com Raspbian FYI. Obrigado.
Mike
1

que tal isso?

top -c -p <PID>
Satish
fonte
4
estamos tentando filtrar por nome do processo (ou sua substring) e, quando você reiniciar o processo, receberá um novo pid.
Srujan Kumar Gulla
1

Acabei usando um script de shell com o seguinte código:

#!/bin/bash

while [ 1 == 1 ]
do
    clear
    ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
    sleep 5
done
Bobo da corte
fonte
1

A maioria das respostas falha aqui, quando a lista de processos excede 20 processos. Esse é o top -plimite da opção. Para aqueles com top mais antigo que não oferece suporte à filtragem com oopções, eis um exemplo de script para obter a saída em tela cheia / console (informações resumidas estão ausentes nesta saída).

__keyword="YOUR_FILTER" ; ( FILL=""; for i in  $( seq 1 $(stty size|cut -f1 -d" ")); do FILL=$'\n'$FILL; done ;  while :; do HSIZE=$(( $(stty size|cut -f1 -d" ")  - 1 ));  (top -bcn1 | grep "$__keyword"; echo "$FILL" )|head -n$HSIZE; sleep 1;done )

Algumas explicações

__keyword = your grep filter keyword
HSIZE=console height
FILL=new lines to fill the screen if list is shorter than console height
top -bcn1 = batch, full commandline, repeat once
Manwe
fonte
1

Em htop, você pode simplesmente pesquisar com

/process-name
serv-inc
fonte