Limite la salida del comando TOP a un nombre de proceso específico

81

Si llama al comando superior, obtiene todos los procesos en ejecución. Pero, ¿cómo puedo limitar la salida solo a un determinado nombre de proceso como "java" ?

He probado este top -l 2 | grep java, pero de esta manera solo obtiene instantáneas y no una lista actualizada continuamente. Y arriba -l 0 | grep java no es muy claro.

Alex
fuente
5
Desafortunadamente, hasta ahora todavía no hay una respuesta válida ya que -p & -b no son compatibles con el comando superior de OS X.
Alex
He publicado lo que tal vez sea la primera solución OSX a continuación, y justo a tiempo;)
Anti Earth

Respuestas:

131

Prefiero lo siguiente para poder usar top de forma interactiva sin tener que buscar los pids cada vez que lo ejecuto:

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`

Por supuesto, si los procesos cambian, tendrá que volver a ejecutar el comando.

Explicación:

  • pgrep process-name devuelve una lista de identificadores de proceso que están separados por líneas nuevas
  • tr "\\n" "," traduce estas nuevas líneas en comas, porque la parte superior quiere una lista separada por comas de identificadores de proceso
  • sedes un editor de transmisiones y sed 's/,$//'se usa aquí para eliminar la coma al final
Rick Byers
fuente
2
La mejor respuesta, mejora la de la dogbane para que pueda escribir el nombre en lugar de pegar muchos PID. (Y esto es así)
sabgenton
1
Te votaría varias veces si pudiera, creo que esta debería ser la respuesta "aceptada".
spuriousdata
6
Estoy consiguiendo top: pid limit (20) exceeded. ¿Existe de todos modos alrededor de ese límite?
Celwell
7
@celwell, inténtalo top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//'). Esto mostrará datos de hasta los primeros 20 PID devueltos por pgrep.
Acumenus
3
A partir de Yosemite (¿o antes?) Es en -pidlugar de -p.
máximo
53

Busque los pids de los procesos que desea monitorear y luego use la -popción que le permite proporcionar una lista de pids al topcomando.

Ejemplo:

top -p 18884 -p 18892 -p 18919

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
18884 user  25   0  672M  95M  9476 S     0.0  1.1   0:02   1 java
18892 user  25   0 2280M 123M 12252 S     0.0  1.5   0:05   1 java
18919 user  22   0 1492M 198M 28708 S     0.0  2.4   0:07   1 java

(Creo que también puede pasar una lista separada por comas).

dogbane
fuente
7
En Mac debería ser "top -pid ID" pero el proceso de Java puede tener varios ID distintos, ya que puede haber varios procesos de Java.
Alex
32

¿qué tal top -b | grep java

Faisal Feroz
fuente
1
No funciona en Mac porque Mac usa herramientas BSD y no herramientas GPL. Y hay algunas diferencias. Supongo que la versión "-b" es similar a "-l 0" pero también se imprime el encabezado de la tabla.
Alex
29

Ampliando la respuesta de @ dogbane , puede obtener todos los PID para un proceso con nombre pgreppara hacer lo siguiente:

top -p "$(pgrep -d ',' java)"
l0b0
fuente
2
Esto tiene un límite máximo de 20 pids
mrP
top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
MRP
¡Tienes razón! man topdice "Esta opción se puede dar hasta 20 veces, o puede proporcionar una lista delimitada por comas con hasta 20 pids". Bueno, maldición.
l0b0
6

Usa el comando de vigilancia

watch -d 'top -n1 | grep mysql'
tszming
fuente
Debe ser "ver --d". Sin embargo, no obtengo ningún resultado al ejecutar este comando.
Alex
-1:: man watch"el reloj ejecuta el comando repetidamente, mostrando su salida y errores "; no muestra los procesos actualmente en ejecución como lo tophace
sdaau
@AlexanderOrlov, no hay magia especial aquí, solo use top -n1 para imprimir y salir, y use watch para monitorearlo continuamente.
tszming
@sdaau, su comentario es irrelevante para mi respuesta, responda con más cuidado la próxima vez.
tszming
1
Creo que deberíamos agregar -b opciones. watch -d 'top -b -n1 | grep mysql'
Reyes Yang
6

Usando la respuesta de aquí pude crear una línea

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

Esto me funciona en MacOS 10.12 (Sierra)

bcjenkins
fuente
2

Resolví mi problema usando:

top -n1 -b | grep "nombre de proceso"

en este caso: -n se usa para establecer cuántas veces top será qué proceso
y -b se usa para mostrar todos los pids

evita errores como: top: límite pid (20) excedido

Markomafs
fuente
2

El siguiente código actualiza una lista de procesos cada 5 segundos mediante el comando watch:

watch -n 5 -t top -b -n 1 -p$(pgrep java | head -20 | tr "\\n" "," | sed 's/,$//')

gnod
fuente
2

Lo ejecuto (por ejemplo): top -b | egrep -w 'java|mysqld'

Alessandro Nizzo
fuente
1

Supongamos ... si tenemos más de 20 procesos ejecutándose en el servidor con el mismo nombre ... esto no ayudará

top -p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'

Intentará enumerar y proporcionar una salida en tiempo real de 20 procesos en los que tenemos buenas posibilidades de perder otros procesos que consumen más recursos ...

Todavía estoy buscando una mejor opción en esto.

user3482072
fuente
0

Un caso más específico, como el que realmente estaba buscando:

Para los procesos de Java, también puede usar, jps -qpor lo que jps es una herramienta de $ JAVA_HOME / bin y, por lo tanto, debería estar en su $ PATH.

Alex
fuente
0

Vine aquí buscando la respuesta a esto en OSX. Terminé obteniendo lo que quería con bash y awk:

topfiltered() {
  [[ -z "$1" ]] && return
  dump="/tmp/top_dump"
  rm -f "$dump"
  while :; do
    clear
    [[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
    top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}

Hago un bucle superior en el modo de registro y lo filtro con awk, creando una matriz asociativa a partir de la salida de pgrep. Awk imprime las primeras 12 líneas, donde la línea 12 son los encabezados de columna, y luego cada línea que tiene un pid que es una clave en la matriz. El archivo de volcado se utiliza para un bucle más visualizable.

Aktivb
fuente
En OSX, podría usar algo como pgrep <process_name>; top -pid <pid_specified_by_pgrep>
bergercookie
0

solo top -bn 1 | grep javahará el truco por ti

Gurú
fuente
0

Ejecutar lo siguiente dará una actualización continua en la consola:

bcsmc2rtese001 [~]$ echo $SHELL  
/bin/bash  
bcsmc2rtese001 [~]$ top | grep efare  or watch -d 'top | grep efare' or top -p pid
27728 efare     15   0 75184 3180 1124 S  0.3  0.0 728:28.93 tclsh  
27728 efare     15   0 75184 3180 1124 S  0.7  0.0 728:28.95 tclsh
Ayyappa Boligala
fuente
0

Aquí está la única solución hasta ahora para MacOS:

top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

aunque esto informará indeseablemente invalid option or syntax: -pidsi no hayjava procesos vivos.

EXPLICACIÓN

Las otras soluciones publicadas aquí usan el formato top -p id1,id2,id3, pero MacOS topsolo admite el formato difícil de manejartop -pid id1 -pid id2 -pid id3 .

Entonces, en primer lugar, obtenemos la lista de identificadores de proceso que tienen el nombre de proceso "java":

pgrep java

y canalizamos esto a lo awkque une los resultados con delimitador" -pid "

| awk 'ORS=" -pid "'

¡Ay, esto deja un delimitador final! Por ejemplo, es posible que hasta ahora hayamos obtenido la cadena"123 -pid 456 -pid 789 -pid " .

Luego solo usamos sedpara recortar los 6 caracteres finales del delimitador.

| sed 's/.\{6\}$//'`

Estamos listos para pasar los resultados a top:

top -pid `...`
Anti Tierra
fuente
0

obtener el pid del proceso:

# pidof <process>

decirle a la parte superior qué pid (s) de proceso mostrar

# top -p <pid1>,<pid2>, etc

ejemplo:

landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709

Top solo mostrará los 2 procesos 'konsole'. Esto es útil en un servidor ocupado a través de ssh, sin tener que pasar por grep.

Landis Reed
fuente
lo siento, no vi la etiqueta macos en cuestión. el mío funciona en todas mis cajas Linux.
Landis Reed
-1

Usando el enfoque mencionado en la respuesta de Rick Byers:

top -p `pgrep java | paste -sd "," -`

pero tenía más de 20 procesos en ejecución, por lo que seguir el comando puede ser útil para alguien que se encuentre en una situación similar.

top -p `pgrep java | head -n 20 | paste -sd "," -`

pgrepobtiene la lista de procesos con nombre de pila, java en este caso. headse usa para obtener los primeros 20 pids porque top no puede manejar más de 20 pids cuando se usa el argumento -p. Finalmentepaste une a la lista de pids con ','.

Puede controlar el nombre del proceso que está buscando en el comando anterior y la cantidad de procesos con ese nombre que le interesa ver. Puede ignorar la head -n 20parte si el número de sus procesos con el nombre dado es menor que 20.

shaffooo
fuente