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, ysed ''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