El comando top -c en Linux para filtrar los procesos enumerados en función del nombre del proceso


149
top -c

Top enumera todos los procesos, hay buenas opciones para filtrar los procesos por nombre de usuario utilizando la opción -u, pero me pregunto si hay alguna manera fácil de filtrar los procesos en función del nombre de proceso que aparece en la columna COMANDO de la salida superior.

Por ejemplo, me gustaría que la opción top -some -substring of processname y top muestre pids que solo tengan esta subcadena en su nombre de comando

Respuestas:


214

Usando pgrep para obtener pid de líneas de comando coincidentes:

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

top -pespera una lista de pids separada por comas, así que la usamos -d','en pgrep. La -fbandera en pgrep hace que coincida con la línea de comando en lugar del nombre del programa.


12
solo recuerde que si se generan nuevos procesos para 'string_to_match_in_cmd_line', no aparecerán en la parte superior; tendrías que salir de arriba y volver a ejecutar este comando
eugenevd

1
Como dijo eugenevd, esto no funcionará para los nuevos procesos iniciados después de que se llame a la parte superior. ¿Hay alguna manera de hacerlo? Necesito ejecutar varios programas con el mismo prefijo en su nombre, y me encantaría ver cuántos de ellos se ejecutan en vivo, sin necesidad de ejecutar un nuevo top (o solo un ps) cada vez.
Jester

1
@Jester, eugenevd, tuve el mismo problema que tú. Hice una nueva versión en stackoverflow.com/a/27653841/681830 , espero que ayude.
Val

55
Me encontré con top: pid limit (20) exceededlo que utiliza la siguiente: top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01

115

Se puede hacer de forma interactiva.

Después de ejecutar top -c, presione oy escriba un filtro en una columna, por ejemplo, para mostrar filas donde la columna COMMAND contiene la cadena foo, escribaCOMMAND=foo

Si solo desea un resultado básico, esto podría ser suficiente:

top -bc |grep name_of_process

77
Esto me da 'opción o sintaxis no válida: -bc'
shmim

3
top -bc -n 1 es más conveniente, ya que limita el número de iteraciones a 1.
galath

1
Esta debería ser la respuesta aceptada. Es más preciso y funciona solo con las opciones proporcionadas por el comando 'top'. Y muestra nuevos procesos.
Abraham TS

Los procesos siguen desapareciendo y reapareciendo con top -c , hit o and write a filter on a column.
MrR

92

Puede agregar filtros topmientras se está ejecutando, simplemente presione la otecla y luego escriba una expresión de filtro. Por ejemplo, para monitorear todos los procesos de Java, use la expresión de filtro COMMAND=java. Puede agregar varios filtros presionando la tecla nuevamente, puede filtrar por usuario con la utecla y puede borrar todos los filtros con la =tecla.


2
Esta es una solución mejor que la respuesta aceptada (esta solución planteó 3 años más tarde que la original). A diferencia del original, esta solución también funciona en procesos recién generados. Muy importante si está monitoreando procesos de Apache que se crean a pedido.
Nate Lampton

2
De hecho, una mejor solución porque filtra en vivo. La solución aceptada resuelve los identificadores de proceso antes de ejecutar top. El proceso resultante es como el top -c -p 920,1345,1346que está arreglado.
Jérôme Gillard

44
El uso ocomo filtro no existe en algunas versiones (anteriores) de top: el top: procps version 3.2.8filtro de usuario existe, por lo que funciona.
Manwe

13

¡El comando de @perreal funciona muy bien! Si lo olvida, intente en dos pasos ...

ejemplo: filtre la parte superior para mostrar solo la aplicación llamada yakuake:

$ pgrep yakuake
1755

$ top -p 1755

comandos interactivos superiores útiles 'c': alternar ruta completa vs. nombre de comando 'k': matar por PID 'F': filtrar por ... seleccionar con flechas ... luego presionar 's' para establecer la clasificación

la respuesta a continuación también es buena ... Lo estaba buscando hoy pero no pude encontrarlo. Gracias


7

Después de buscar tantas respuestas en StackOverflow, no he visto una respuesta que se ajuste a mis necesidades.

Es decir, hacer que el comando top se mantenga actualizado con la palabra clave dada, y no tenemos que presionar CTRL + C / top una y otra vez cuando se generan nuevos procesos.

Así hago uno nuevo ...

Aquí va la versión sin reinicio necesario.

__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 la palabra clave __ y debería funcionar. (Ubuntu 2.6.38 probado)

2.14.2015 agregado: falta la parte de carga de trabajo del sistema con el código anterior. Para las personas que se preocupan por la parte del "promedio 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;)

Falta una descripción general sobre la carga de trabajo del sistema. agregue "tiempo de actividad" antes de dormir, para listas de proceso cortas, esto es suficiente en mi humilde opinión.
Sevyls

1
@Sevyls Gracias por señalar! Después de otros pocos intentos (que no funcionan tan bien), su versión podría ser una de las mejores. Respuesta modificada
Val

Funciona muy bien si tengo uno o más procesos en ejecución que coinciden pero obtengo un "usuario superior: Inválido" cuando todos se detienen. Se recupera cuando comienza otro proceso. Estoy corriendo en Raspbian FYI. Gracias.
Mike

1

que hay de esto

top -c -p <PID>

44
estamos tratando de filtrar por nombre de proceso (o su subcadena) y cuando reinicie su proceso obtendrá un nuevo pid.
Srujan Kumar Gulla

1

Terminé usando un script de shell con el siguiente código:

#!/bin/bash

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

1

La mayoría de las respuestas fallan aquí, cuando la lista de procesos supera los 20 procesos. Esa es la top -popción límite. Para aquellos con la parte superior más antigua que no admite el filtrado con oopciones, aquí hay un ejemplo programable para obtener la salida de la pantalla completa / consola (falta información resumida en esta salida).

__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 )

Algunas explicaciones

__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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.