comando top-c no linux para filtrar os processos listados com base no nome do processo
top -c
o topo lista todos os processos, existem boas opções para filtrar os processos pelo nome de utilizador, usando a opção-u, mas estou a pensar se há alguma maneira fácil de filtrar os processos com base no nome do processo listado na coluna de comando da saída de topo.
por exemplo, Gostaria que o top-some option-substring do processname e o top displays pids só tivesse este sub-texto no seu nome de comando
8 answers
A usar o pgrep para obter o pid das linhas de comando correspondentes:
top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line)
O Top -p
espera uma lista separada por vírgulas de pids, por isso usamos -d','
em pgrep. A opção -f
no pgrep faz com que corresponda à linha de comandos em vez do nome do programa.
Pode ser feito interactivamente
Depois de executar top -c
, Carregue em o e escreva um filtro numa coluna, por exemplo para mostrar linhas onde a coluna de comando contém o texto XPTO, escreva COMMAND=foo
Se você só quer um pouco de saída básica isto pode ser suficiente:
top -bc |grep name_of_process
Poderá adicionar filtros a top
enquanto estiver em execução, basta carregar na tecla o e depois escrever uma expressão de filtro. Por exemplo, para monitorar todos os processos java use a expressão do filtro COMMAND=java
. Poderá adicionar vários filtros se carregar na tecla de novo, poderá filtrar pelo utilizador com a tecla u , e poderá limpar todos os filtros com a tecla= chave.
Exemplo: filtrar o topo para mostrar apenas a aplicação chamada yakuake:
$ pgrep yakuake
1755
$ top -p 1755
Comandos interactivos de topo úteis 'c': comutar o nome completo da localização vs. comando "k": matar por PID "F": filtrar... selecione com setas... em seguida, pressione ' s ' para definir o tipo
A resposta abaixo também é boa... Estava à procura disso hoje, mas não consegui encontrá-lo. Obrigado.
Isto é, para fazer com que o comando top continue a actualizar com a palavra-chave dada, e não temos de CTRL+C / top Uma e outra vez quando novos processos desovam.
Assim, faço um novo... Aqui vai a versão que não precisa de reiniciar.__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;)
Modifica a palavra-chave __e deve funcionar.
2.14.2015 adicionado: Falta a parte relativa à carga de trabalho do sistema com o código acima. Para as pessoas que se preocupam com a parte "média de carga":
__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;)
top -c -p <PID>
A maioria das respostas falham aqui, quando a lista de processos excede 20 processos. Esse é o limite de Opção top -p
.
Para aqueles com o Topo mais antigo que não suporta a filtragem com as opções o
, aqui está um exemplo programável para obter a saída do ecrã/consola completo (falta informação de resumo 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
Acabei por usar um script 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