Filtrado de salida del comando superior

12

Estoy ejecutando una Mac y quiero filtrar la salida del topcomando para un proceso en particular, de modo que solo se muestren las columnas PID, COMMAND y% CPU.

Después de obtener el PID del proceso, ejecuto:

top -pid 1234

Sin embargo, esto muestra más de 15 columnas para ese proceso. ¿Puedo canalizar la salida de 'el comando a awk y mostrar solo:

PID COMMAND %CPU

columnas?

No quiero almacenar el resultado en un archivo de texto y luego procesarlo. Estoy interesado en monitorear el proceso en tiempo real.

smokinguns
fuente

Respuestas:

8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: su ID de proceso
  • -stats pid,command,cpu: solo muestra el ID del proceso, el nombre y el% de CPU

No es necesario ejecutar awken la salida.


Si desea procesar posteriormente la salida, utilice -l 0para ejecutar en modo de registro (0 significa indefinidamente, todo lo demás limita el número de muestras). La salida se verá así (dos repeticiones):

Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09 
CPU usage: 20.0% user, 26.66% sys, 53.33% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 0.0 
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09 
CPU usage: 0.95% user, 1.90% sys, 97.14% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 2.7 

Use awkuna herramienta similar para mostrar solo cada línea 13 (ya que estas líneas contienen los valores en ese ejemplo):

$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907  WindowServer 0.0 
3907  WindowServer 1.3 
3907  WindowServer 2.2 
Daniel Beck
fuente
# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg
@AstraSerg funciona para mí. Tenga en cuenta que esta es una pregunta de Mac OS, que tiene una versión diferente topde Linux.
Daniel Beck
6

Esto ciertamente se puede hacer y voy a explicar cómo lo haría. No pretendo que este sea un enfoque óptimo, pero hace el trabajo. Estoy usando Linux (y bash shell), por lo que el comportamiento predeterminado de mi parte superior puede ser ligeramente diferente. Por lo tanto, es posible que deba ajustar este mini-cómo para su escenario particular.

  1. Simplemente ejecuta top , sin ningún argumento:

    $ top

    Aquí está el encabezado y una línea relevante de mi salida:

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java

    He recogido un proceso que permanece en la memoria durante algún tiempo y en realidad consume CPU, lo usaré como proceso de prueba para alcanzar el objetivo final.

  2. Por defecto, top se ejecuta en modo interactivo. Esto no me conviene, quiero capturar los datos relevantes e imprimirlos. Me encargaré de la tarea de mostrar los datos de forma interactiva después de eso. Citas relevantes de la página principal:

    -b: Operación en modo por lotes Comienza arriba en 'Modo por lotes', lo que podría ser útil para enviar resultados desde arriba a otros programas o a un archivo. En este modo, top no aceptará entradas y se ejecutará hasta que el límite de iteraciones que haya establecido con la opción de línea de comandos '-n' o hasta que se elimine.

    -n: el límite de número de iteraciones como: -n número Especifica el número máximo de iteraciones, o cuadros, que debe producir la parte superior antes de finalizar.

    Este es el comando superior ajustado que imprime la salida solo una vez y luego sale:

    $ top -b -n 1

  3. Conozco el PID que quiero ver, así que agregaré una restricción más al principio, para que imprima datos solo sobre ese proceso:

    $ top -b -n 1 -p 2569

  4. Incluso en el modo por lotes, la parte superior todavía imprime un encabezado, que contiene estadísticas misceláneas de todo el sistema, como tiempo de actividad, memoria libre / intercambio, etc. No necesito esto. Todo lo que necesito es solo una línea, la que contiene datos sobre mi proceso, así que la cortaré de la salida completa de esta manera:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1

    Como puede ver, tengo la segunda línea de 1.

  5. Conectaré esta línea a awk para extraer solo las columnas que necesito:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  6. Hasta ahora, he estado haciendo estas manipulaciones en la línea de comandos, ahora es el momento de agregar algo de persistencia y flexibilidad a nuestro caso particular codificado. Estoy moviendo toda la línea en un simple script de shell. Lo llamaré 3top , el nombre se enfatiza porque se usará más tarde:

    #!/bin/bash

    top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  7. El número PID está codificado, así es cómo hacer que el script lo acepte como argumento de línea de comando:

    #!/bin/bash

    top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

    Para hacer estadísticas de visualización 3top sobre PID 2569, debe llamarse así:

    $ ./3top 2569

  8. También quiero que se muestre el porcentaje después de la carga de la CPU, así que estoy ajustando mi script 3top de esta manera:

    #!/bin/bash

    out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')

    echo "$out%"

    Redirigí toda la salida de una cadena de comandos (conectados a través de tuberías) a una variable. Luego lo imprimo usando echo y agrego un '%' al final, ya que la carga de la CPU es el último campo

  9. En este punto, tengo un script por lotes que acepta un PID como argumento e imprime estadísticas una vez. ¿Quieres un monitoreo en tiempo real? ¡Es fácil, porque el reloj puede hacerlo! Ejecute el script así:

    $ watch -n 1 3top 2569

    Monitoreará en tiempo real ejecutando 3top una vez por segundo.

vtest
fuente
11
El usuario está en OS X y no tiene Gnu top. opción o sintaxis no válida: -b . No tengo idea de por qué esto fue repetidamente votado.
Daniel Beck
55
Gnu top(in procps) no puede instalarse usando Homebrew, MacPorts o Fink y no puede compilarse desde la fuente usando makeo cc top.c.
Daniel Beck
2

El topformato de visualización es personalizable, pero no hay una manera de especificar las opciones de visualización en la línea de comando. Sin embargo, si eres inventivo, probablemente puedas hacer lo que necesites manipulando hábilmente el ~/.toprcarchivo.

Suponiendo que aún no ha personalizado la visualización de top(y no tiene un ~/.toprcarchivo):

  1. Lanzamiento top.
  2. Presione fpara ingresar al modo de selección de campo.
  3. Para cada campo que tenga un *lado que no desee, presione la letra correspondiente para anular la selección de ese campo. Por ejemplo, presione epara anular la selección del User Namecampo. Cuando haya terminado, sólo se debe tener un *lado Process Id, CPU usagey Command name/line.
  4. Presione Spacepara regresar a la ventana principal.
  5. Presione W(es decir, Shift+ w) para guardar el diseño actual en su ~/.toprcarchivo.
  6. Salga top, luego reinicie para verificar que su configuración esté guardada.
  7. Cuando desee volver al diseño predeterminado, cambie el nombre ~/.toprca algo como ~/min.toprcantes de iniciar top. Cuando desee cambiar al diseño mínimo, cambie el nombre ~/min.toprca ~/.toprcantes de iniciar top.

topProbablemente, alguien con mucha más experiencia y conocimiento que yo pueda trabajar en el cambio de nombre y el lanzamiento de este archivo en un simple script de shell. Necesitará una consideración especial si su topdiseño regular ya ha sido personalizado.

William Jackson
fuente
¿Es posible agregar un filtro (aunque sea manualmente) .toprc? Me gusta agregar el filtro RUID>999al inicio.
Dr. Beco