Como visualizar um processo específico na parte superior

47

Existem opções relativamente simples com top para rastrear um processo específico?
Idealmente, identificando o processo por um valor legível por humanos? por exemplo chromeou java.

Em outras palavras, quero visualizar todas as informações típicas que o topo fornece, mas para que os resultados sejam filtrados para os parâmetros fornecidos, ou seja. 'chrome' ou 'java'

Michael Coleman
fonte
1
você já tentou top | grep chrome?
Pandya
1
você também pode usar ps -x | chromepara obter pid (deixe o pid mostrado 2034) e então #top | grep 2034
Pandya 31/10
top | grep chromefuncionou perfeitamente - obrigado!
Michael Coleman
@ Pandand - também, o processo que eu estava procurando executou apenas por alguns segundos (node.js durante um teste de integração) - o que significava que quando eu recebia ps -x | process_nameo PID, quando eu executava o processo novamente, o PID era diferente e, portanto, o o PID original não o identificaria.
Michael Coleman

Respostas:

24

Você pode simplesmente usar grep:

NAME
       grep, egrep, fgrep, rgrep - print lines matching a pattern

SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

DESCRIPTION
       grep  searches  the  named  input  FILEs (or standard input if no files are named, or if a single
       hyphen-minus (-) is given as file name) for lines containing a match to the  given  PATTERN.   By
       default, grep prints the matching lines.

Execute o seguinte comando para obter a saída desejada (ex-chrome):

top | grep chrome

Aqui estamos usando grepcom pipelines |para top& greprun paralelamente; topsaída fornecida para grep(como entrada) e grep chromefiltra as linhas correspondentes chromeaté topparar.

Pandya
fonte
1
obrigado, sei que outras pessoas têm suas preferências, mas gosto desta resposta porque é fácil de entender e, portanto, é mais fácil de lembrar no futuro! - Eu teria upvoted mas eu não tenho reputação suficiente ...
Michael Coleman
3
Isso só funciona se o processo estiver na saída exibida no topo. Acho @ resposta de Ramesh deve ser a aceitaram um
jb
@JamieBullock, a pergunta lida topapenas com o OP e o filtro deseja filtrar o processo com base top.
precisa
@ Pandya, na verdade, retiro meu comentário anterior, pois foi baseado em um erro no meu código. Ainda acho que a resposta de @ Ramesh é melhor (e também filtra o processo com base no topo). I pode facilmente quebrar o seu exemplo, comsleep 10 & top | grep sleep
jb
Eu gosto mais do unix.stackexchange.com/a/165343/48973 porque mostra os cabeçalhos.
21718 Ryan
39

Da minha outra resposta aqui , você poderia fazer algo como,

top -p `pgrep "java"`
Ramesh
fonte
4
top -p `pgrep "java"`dá-me o seguinte erro em um shell bash top: -p requires argument. top -ppgrep -d ',' "apache2" funcionou para mim, mas eu realmente não entendi o que o comando estava fazendo - é uma maneira de alimentar vários argumentos para o topo?
Michael Coleman
@ Jamesh, você precisa deixar a pidlista separada por vírgula para funcionar.
Kannan Mohan
3
Esta é a resposta certa.
J03m
1
+1 Esta é a resposta correta. "top | grep Chrome" é bastante bárbaro, porque retira TODA A SAÍDA da parte superior que não corresponde ao "Chrome", perdendo itens como os rótulos do cabeçalho e da coluna. Usar um subshell com a saída do pgrep é uma aplicação correta da filosofia do unix.
precisa saber é o seguinte
2
@loretoparisi que pode ser porque o seletor que você está usando corresponde a vários processos. Veja esta resposta para um comando que funciona com um ou mais processos correspondentes.
Michael Hays
21
top -p `pgrep -d "," java`

Explicação:

  1. top -p pid1,pid2: mostre várias informações do processo, o pid deve ser separado por ,
  2. pgrep -d "," java: imprime os pids de todos os programas java; os pids são separados por uma nova linha por padrão. use o -d ","para separá-lo ,conforme exigido pela parte superior.

Se você top: -p argument missingvir um erro semelhante , significa que nenhum programa java está sendo executado, ou seja, o pgrep não possui saída.

Mingjiang Shi
fonte
1
Esta solução funciona melhor do que usar apenas o top -p pgrep "java" `` `. obrigado.
loretoparisi
1
Impeça o erro verificando pgrepo código de saída:pids="$(pgrep -d, java)" && top -p "$pids"
syme
12

No OpenBSD top, basta pressionar ge digitar o nome do comando que você deseja filtrar.

No topUbuntu, por exemplo, pressione oe digite eg COMMAND=chromepara mostrar apenas as entradas da COMMANDcoluna que são iguais a chrome.

Nos Linux que usam a mesma topimplementação que o Ubuntu, leia a seção FILTRANDO em uma Janela no topmanual.

Kusalananda
fonte
7

Outras boas respostas foram fornecidas, mas fiz um script há algum tempo, que chamei de ptop, que me serve bem:

#!/bin/sh
top -p $(pidof "$@" |sed s#\ #,#g) 2>/dev/null
if [ $? -ne 0 ]; then
  echo No processes with the specified name\(s\) were found
fi

Isso suporta vários nomes de processos a serem especificados (como ptop bash chrome) e fornece uma mensagem de erro melhor caso não exista / não haja processos com nenhum dos nomes especificados em execução.

Marcelo
fonte
3

Se você deseja permanecer tope manter todos os outros processos à vista para o contexto, pressione Lpara pesquisar por seu processo:

Locate string chrome

Isso destacará qualquer processo com chromeo nome e o exibirá . Use &para ir para a próxima partida.

Você pode pressionar cpara alternar entre mostrar o nome do processo e o comando completo.

Jonatan
fonte
Isso ^ porque pessoas RTFM! man top | less +/5d
Cprn 26/10/19
0

Você também pode usar um filtro na parte superior para isolar processos específicos. Pressione 'O' para exibir o prompt do filtro. Em seguida, digite um filtro formatado como FIELD = value. Por exemplo, para filtrar todos os processos tmux, use:

COMMAND=tmux

Use '=' para redefinir os filtros. Veja a seção intitulada 'FILTRANDO' na página principal.

Gearoid Murphy
fonte