Formatar amostras sar ao vivo com paste e awk

2

Estou combinando amostras de sar ao vivo com colar e tentando formatar a saída com o awk live.

Funciona como esperado para formatar a saída, mas não faz a formatação ao vivo em cada amostra e, em vez disso, espera até que os 50 segundos completos (5 amostras de s, 10 deles) sejam concluídos.

Solution was (stdbuf -o0) to disable buffering on the output stream

stdbuf -o0 paste <(sar -q 1 5) <(sar -r 1 5) | awk '{printf "%8s %2s %7s %7s %7s %8s %9s %8s\n", $1,$2,$3,$4,$5,$11,$12,$13}'

11:53:21 AM runq-sz plist-sz ldavg-1 kbmemfree kbmemused %memused
11:53:22 AM       1     167    0.03    46504    449264    90.62
11:53:23 AM       1     167    0.03    46504    449264    90.62
11:53:24 AM       1     167    0.03    46504    449264    90.62
11:53:25 AM       1     167    0.03    46008    449760    90.72
11:53:26 AM       1     167    0.03    46624    449144    90.60
Average:  1     167    0.03    0.05    90.64     40876   172816

Primeiro comando sar

sar -q 5 10 | awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}'

01:02:08 AM runq-sz plist-sz ldavg-1
01:02:13 AM       1     160    0.09
01:02:18 AM       1     160    0.08
01:02:23 AM       1     160    0.08

Segundo comando sar

sar -r 5 10 | awk {'printf "%-8s %-2s %9s %9s %8s\n", $1,$2,$3,$4,$5}'

01:19:27 AM kbmemfree kbmemused %memused
01:19:32 AM    113840    381928    77.04
01:19:37 AM    113800    381968    77.05
01:19:42 AM    113840    381928    77.04

Usar o colar sozinho funciona para combinar os relatórios do sar em tempo real

paste <(sar -q 5 10) <(sar -r 5 10)

01:21:09 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked 01:21:09 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
01:21:14 AM         2       159      0.00      0.03      0.05         0 01:21:14 AM    111416    384352     77.53     12512    142052    948776    191.37    195400    121036        56
01:21:19 AM         2       157      0.00      0.03      0.05         0 01:21:19 AM    111928    383840     77.42     12512    142056    947168    191.05    195060    121036        60
01:21:24 AM         1       156      0.00      0.03      0.05         0 01:21:24 AM    112244    383524     77.36     12528    142060    946784    190.97    194932    121052        72

Tentar formatar com o awk dentro da pasta não mostra nada até que as amostras do sar sejam concluídas

As mesmas coisas acontecem ao fazer a formatação do awk depois que a colagem é combinada

paste <(sar -q 5 10 | awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}') <(sar -r 5 10 | awk {'printf "%9s %9s %8s\n", $3,$4,$5}')

01:56:53 AM runq-sz plist-sz ldavg-1    kbmemfree kbmemused %memused
01:56:58 AM       1     157    0.00     99664    396104    79.90
01:57:03 AM       1     157    0.00     99664    396104    79.90
01:57:08 AM       1     157    0.00     99644    396124    79.90
01:57:13 AM       1     157    0.00     99612    396156    79.91
01:57:18 AM       1     157    0.00     99628    396140    79.90
01:57:23 AM       1     157    0.00     99656    396112    79.90
01:57:28 AM       1     157    0.00     99520    396248    79.93
01:57:33 AM       1     157    0.00     99656    396112    79.90
01:57:38 AM       2     157    0.00     99268    396500    79.98
01:57:43 AM       1     157    0.00    100152    395616    79.80
Average: 1      157    0.00    0.01    396122     79.90    17557

Se eu usar os logs completos do sar em vez de amostras, isso funciona obviamente

paste <(sar -q | awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}') <(sar -r | awk {'printf "%9s %9s %8s\n", $3,$4,$5}')

12:00:01 AM runq-sz plist-sz ldavg-1    kbmemfree kbmemused %memused
12:10:01 AM       3     156    0.00     71500    424268    85.58
12:20:01 AM       1     150    0.00    110836    384932    77.64
12:30:01 AM       1     150    0.00    108164    387604    78.18

Então, existe alguma maneira de ter o comando paste atualizado para o awk após cada amostra para que eu possa assistir a saída formatada ao vivo?

    
por JacobN 02.08.2015 / 04:12

1 resposta

3

As respostas em Desativar o buffer no tubo fornecem várias técnicas que você pode usar. A idéia principal é que os comandos que não estão conectados a um terminal interativo (por exemplo, em um pipeline) estão usando o armazenamento em buffer. Um comando que pode executar outro comando com diferentes configurações de buffer é o comando GNU coreutils stdbuf que você pode aplicar ao seu caso, descompactando cada comando

paste <(stdbuf -i0 -o0 -e0 sar -q 5 10 | stdbuf -i0 -o0 -e0 awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}') <(stdbuf -i0 -o0 -e0 sar -r 5 10 | stdbuf -i0 -o0 -e0 awk {'printf "%9s %9s %8s\n", $3,$4,$5}')

No stdbuf acima é usado para unbuffer a entrada, saída e erro padrão de cada comando awk e sar.

Como apontado nos comentários, neste caso a saída unbuffering é tudo o que é necessário, então isso pode ser encurtado para

paste <(stdbuf -o0 sar -q 5 10 | stdbuf -o0 awk '{printf "%-8s %-2s %7s %7s %7s\n", $1,$2,$3,$4,$5}') <(stdbuf -o0 sar -r 5 10 | stdbuf -o0 awk {'printf "%9s %9s %8s\n", $3,$4,$5}')
    
por 02.08.2015 / 08:13