top opciones filtrar explicado comando buscar macos unix command-line top-command

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



filtrar comando top (15)

¿qué tal arriba -b | grep java

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

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


Al ejecutar lo siguiente, se actualizará continuamente 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


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

top -p "$(pgrep -d '','' java)"


El siguiente código actualiza una lista de procesos cada 5 segundos a través del comando de observación:

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


Encuentre los pides de los procesos que desea monitorear y luego use la opción -p que le permite proporcionar una lista de pids al comando top .

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


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


Prefiero lo siguiente, así que aún puedo usar top de forma interactiva sin tener que buscar las pides 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 procesos que están separados por líneas nuevas
  • tr "//n" "," traduce estas nuevas líneas en comas, porque arriba quiere una lista de identificadores de proceso separados por comas
  • sed es un editor de flujo, y sed ''s/,$//'' se usa aquí para eliminar la coma final

Resolví mi problema usando:

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

en este caso: -n se usa para establecer cuántas veces arriba ¿Qué proceso?
y -b se usa para mostrar todos los pids

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


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

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

Intentará listar y proporcionar una salida en tiempo real de 20 procesos donde tenemos buenas posibilidades de perder otros procesos que consuman más recursos ....

Todavía estoy buscando una mejor opción en este


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

Para los procesos de Java también puede usar jps -q donde jps es una herramienta de $ JAVA_HOME / bin y por lo tanto debe estar en su $ PATH.


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 encuentra en una situación similar.

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

pgrep obtiene la lista de procesos con el nombre dado - java en este caso. head se usa para obtener los primeros 20 pids porque top no puede manejar más de 20 pids cuando se utiliza el argumento -p. Finalmente paste 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 mirar. Puede ignorar el head -n 20 parte si el número de sus procesos con el nombre dado es menor que 20.


Use el comando de reloj

watch -d ''top -n1 | grep mysql''


Utilizando la respuesta desde here , pude crear un trazador de líneas

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

Esto funciona para mí en MacOS 10.12 (Sierra)


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 }

Bucle superior en modo de registro y filtro con awk, la construcción de una matriz asociativa de la salida de pgrep. Awk imprime las primeras 12 líneas, donde la línea 12 es los encabezados de las columnas, y luego cada línea que tiene un pid que es una clave en la matriz. El archivo de volcado se usa para un bucle más visible.


solo top -bn 1 | grep java top -bn 1 | grep java hará el truco para ti