Filtrando a saída do comando superior

11

Estou executando um Mac e quero filtrar a saída do comando top para um processo específico, de forma que apenas as colunas PID, COMMAND e% CPU sejam exibidas.

Depois de receber o PID do processo, eu corro:

top -pid 1234

No entanto, isso exibe mais de 15 colunas para esse processo. Posso canalizar a saída de 'o comando para awk e exibir apenas o:

PID COMMAND %CPU

colunas?

Eu não quero armazenar a saída em um arquivo de texto e processá-lo. Estou interessado em monitorar o processo em tempo real.

    
por smokinguns 10.05.2011 / 03:15

3 respostas

7
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907 : seu ID de processo
  • -stats pid,command,cpu : mostra apenas o ID do processo, nome e% da CPU

Não é necessário executar awk na saída.

Se você quiser pós-processar a saída, use -l 0 para executar no modo logging (0 significa indefinidamente, tudo o mais limita o número de amostras). A saída ficará assim (duas repetições):

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 awk ou uma ferramenta semelhante para exibir apenas a cada 13 linhas (como essas linhas contêm os valores nesse exemplo):

$ 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 
    
por 10.05.2011 / 19:19
6

Isso certamente pode ser feito e eu vou explicar como eu faria isso. Eu não estou fingindo que esta é uma ótima abordagem, mas faz o trabalho. Eu estou usando Linux (e bash shell), então o comportamento padrão do meu top pode ser um pouco diferente. Assim, você pode precisar ajustar este mini-how para seu cenário particular.

  1. Basta executar top , sem argumentos:

    $ top

    Aqui está o cabeçalho e uma linha relevante da minha saída:

    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

    Eu peguei um processo que permanece na memória por algum tempo e realmente consome CPU, vou usá-lo como processo de teste para atingir o objetivo final.

  2. Por padrão, o top é executado no modo interativo. Isso não combina comigo, quero capturar os dados relevantes e imprimi-los. Eu vou lidar com a tarefa de exibir os dados interativamente depois disso. Citações relevantes da página principal:

    -b : Batch mode operation Starts top in 'Batch mode', which could be useful for sending output from top to other programs or to a file. In this mode, top will not accept input and runs until the iterations limit you've set with the '-n' command-line option or until killed.

    -n : Number of iterations limit as: -n number Specifies the maximum number of iterations, or frames, top should produce before ending.

    Este é o comando top ajustado que imprime a saída apenas uma vez e sai:

    $ top -b -n 1

  3. Eu conheço o PID que quero assistir, então adicionarei mais uma restrição ao topo, para que ele imprima dados apenas sobre esse processo:

    $ top -b -n 1 -p 2569

  4. Mesmo no modo batch, o top ainda imprime um cabeçalho, contendo estatísticas de todo o sistema, como uptime, memória livre / swap, etc. Eu não preciso disso. Tudo que eu preciso é de apenas uma linha - aquela que contém dados sobre o meu processo, então vou cortar de toda a saída assim:

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

    Como você pode ver, eu tenho a segunda linha de 1.

  5. Vou canalizar essa linha para o awk para extrair apenas as colunas de que preciso:

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

  6. Até agora, eu tenho feito essas manipulações na linha de comando, agora é o momento de adicionar alguma persistência e flexibilidade ao nosso caso particular codificado. Eu estou movendo toda a linha em um script de shell simples. Eu chamo de 3top , o nome é enfatizado porque será usado depois:

    #!/bin/bash

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

  7. O número PID é codificado, veja como fazer com que o script aceite isso como argumento de linha de comando:

    #!/bin/bash

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

    Para criar três estatísticas de exibição sobre o PID 2569, ele deve ser chamado assim:

    $ ./3top 2569

  8. Eu também quero porcentagem exibida após a carga da CPU, então estou ajustando meu script 3top assim:

    #!/bin/bash

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

    echo "$out%"

    Eu redirecionei toda a saída de uma cadeia de comandos (conectados por meio de pipes) para uma variável. Então eu apenas imprimo usando echo e adiciono um '%' no final, já que a carga da CPU é o último campo

  9. Neste ponto, eu tenho um script em lote que aceita um PID como argumento e imprime estatísticas uma vez. Quer monitoramento em tempo real? É fácil, porque o watch pode fazer isso! Execute o script assim:

    $ watch -n 1 3top 2569

    Ele fará o monitoramento em tempo real executando três vezes por segundo.

por 10.05.2011 / 05:01
2

O formato de exibição top é personalizável, mas não há como especificar as opções de exibição na linha de comando. Se você é inventivo, no entanto, você provavelmente pode fazer o que precisa manipulando habilmente o arquivo ~/.toprc .

Supondo que você ainda não tenha personalizado a exibição de top (e não tenha um arquivo ~/.toprc ):

  1. Iniciar top .
  2. Pressione f para entrar no modo de seleção de campo.
  3. Para cada campo que tenha um * ao lado dele que você não deseja, pressione a letra correspondente para desmarcar esse campo. Por exemplo, pressione e para desmarcar o campo User Name . Quando estiver pronto, você deve ter apenas um * ao lado de Process Id , CPU usage e Command name/line .
  4. Pressione Espaço para retornar à janela principal.
  5. Pressione W (ou seja, Shift + w ) para salvar o layout atual no seu arquivo ~/.toprc .
  6. Saia de top e reinicie para verificar se suas configurações foram salvas.
  7. Quando você quiser retornar ao layout padrão, renomeie ~/.toprc para algo como ~/min.toprc antes de lançar top . Quando quiser mudar para o layout mínimo, renomeie ~/min.toprc de volta para ~/.toprc antes de lançar top .

Esse arquivo renomeando e iniciando top provavelmente pode ser trabalhado em um script de shell simples por alguém com mais uma experiência e conhecimento do que eu. Você precisará de consideração especial se seu layout top regular já tiver sido personalizado.

    
por 10.05.2011 / 04:01