Filtrando a Saída do Comando Superior

12

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

Depois de obter 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 'do comando para awk e exibir apenas o:

PID COMMAND %CPU

colunas?

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

fumar
fonte

Respostas:

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

Não há necessidade de executar awkna saída.


Se você deseja pós-processar a saída, use -l 0para executar no modo de log (0 significa indefinidamente, todo o resto limita o número de amostras). A saída terá a seguinte aparência (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 awkou uma ferramenta semelhante para exibir apenas a cada 13ª linha (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 
Daniel Beck
fonte
# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg
@AstraSerg Funciona para mim. Observe que essa é uma pergunta do Mac OS, que é diferente topdo Linux.
Daniel Beck
6

Isso certamente pode ser feito e vou explicar como eu faria isso. Não estou fingindo que essa é uma abordagem ideal, mas funciona. Eu estou usando Linux (e bash shell), então o comportamento padrão do meu top pode ser um pouco diferente. Portanto, você pode precisar ajustar este mini-howto para o seu cenário específico.

  1. Basta executar o topo , 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 consome realmente a CPU, vou usá-lo como processo de teste para alcançar o objetivo final.

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

    -b: Operação do modo de lote Inicia o topo no 'Modo de lote', o que pode ser útil para enviar a saída do topo para outros programas ou para um arquivo. Nesse modo, o top não aceita entrada e é executado até o limite das iterações que você definiu com a opção de linha de comando '-n' ou até que seja eliminado.

    -n: Limite do número de iterações como: -n number Especifica o número máximo de iterações ou quadros que a parte superior deve produzir antes de terminar.

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

    $ top -b -n 1

  3. Conheço o PID que desejo assistir, por isso adicionarei mais uma restrição ao topo, para que 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 variadas em todo o sistema, como tempo de atividade, memória livre / troca etc. Não preciso disso. Tudo o que preciso é de apenas uma linha - a que contém dados sobre o meu processo, então cortarei da saída inteira 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 esta linha para o awk para extrair apenas as colunas necessárias:

    $ 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 específico codificado. Estou movendo a linha inteira para um script shell simples. Vou chamá-lo de 3top , o nome é enfatizado porque será usado mais tarde:

    #!/bin/bash

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

  7. O número do PID é codificado permanentemente, eis como fazer o script aceitá-lo como argumento da linha de comando:

    #!/bin/bash

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

    Para criar estatísticas de exibição da 3top sobre o PID 2569, ele deve ser chamado assim:

    $ ./3top 2569

  8. Também quero que a porcentagem seja exibida após o carregamento da CPU, por isso 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%"

    Redirecionei toda a saída de uma cadeia de comandos (conectada através de pipes) para uma variável. Então eu apenas imprimo usando eco e adiciono um '%' no final, já que a carga da CPU é o último campo

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

    $ watch -n 1 3top 2569

    Ele fará o monitoramento em tempo real executando 3top uma vez por segundo.

vtest
fonte
11
O usuário está no OS X e não possui Gnu top. opção ou sintaxe inválida: -b . Não faço ideia por que isso foi repetidamente votado.
Daniel Beck
5
O GNU top(pol procps) não pode ser instalado usando Homebrew, MacPorts ou Fink e não pode ser compilado a partir da fonte usando um makeou outro cc top.c.
Daniel Beck
2

O topformato de exibição é personalizável, mas não há como especificar opções de exibição na linha de comando. Se você é inventivo, no entanto, provavelmente pode fazer o que precisa manipulando o ~/.toprcarquivo de maneira inteligente .

Supondo que você ainda não personalizou a exibição de top(e não possui um ~/.toprcarquivo):

  1. Lançamento top.
  2. Pressione fpara entrar no modo de seleção de campo.
  3. Para cada campo que possui um *próximo que você não deseja, pressione a letra correspondente para desmarcar esse campo. Por exemplo, pressione epara desmarcar o User Namecampo. Quando você é feito, você deve ter apenas um *lado de Process Id, CPU usagee Command name/line.
  4. Pressione Spacepara retornar à janela principal.
  5. Pressione W(ou seja, Shift+ w) para salvar o layout atual no seu ~/.toprcarquivo.
  6. Saia tope reinicie para verificar se suas configurações foram salvas.
  7. Quando você quiser retornar ao layout padrão, renomeie ~/.toprcpara algo como ~/min.toprcantes de iniciar top. Quando quiser mudar para o layout mínimo, renomeie ~/min.toprcpara ~/.toprcantes de iniciar top.

Essa renomeação e inicialização de arquivos topprovavelmente podem ser trabalhadas em um script shell simples por alguém com um pouco mais de experiência e conhecimento do que eu. Você precisará de uma consideração especial se seu toplayout regular já tiver sido personalizado.

William Jackson
fonte
É possível adicionar um filtro (mesmo que manualmente) .toprc? Eu gosto de adicionar o filtro RUID>999na inicialização.
Dr Beco