Pasteとawkを使用してリアルタイムでsarサンプルをフォーマットする

Pasteとawkを使用してリアルタイムでsarサンプルをフォーマットする

ライブsarサンプルをペーストと組み合わせて、awkライブを使用して出力フォーマットを指定してみました。

期待どおりに出力フォーマットを指定しますが、各サンプルをリアルタイムでフォーマットするのではなく、合計50秒(サンプル5秒、10)が完了するのを待ちます。

解決策は、出力ストリームでバッファリングを無効にすることです(stdbuf -o0)。

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

最初の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

2番目の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

貼り付けのみを使用して、2つのsarレポートをリアルタイムでマージします。

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

フォーマットするために貼り付け内でawkを試しましたが、sarサンプルが完了するまで何も表示されません。

貼り付けマージ後にawkフォーマットを実行すると同じことが発生します。

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

サンプルの代わりに完全なsarログを使用すると、明らかに機能します。

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

それでは、フォーマットされた出力スクロールをリアルタイムで表示できるように、各例の後に貼り付けコマンドをawkに更新する方法はありますか?

答え1

正解はパイプラインでバッファリングをオフにする利用可能なさまざまな技術を提供します。主なアイデアは、対話型端末(パイプなど)に接続されていないコマンドがバッファリングを使用することです。異なるバッファリング設定で他のコマンドを実行できるコマンドの1つは、GNU coreutilsstdbufコマンドです。これをケースに適用し、各コマンドをバッファリング解除できます。

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}')

上記のstdbufは、各awkおよびsarコマンドの入力、出力、および標準エラーをバッファリング解除するために使用されます。

コメントで指摘したように、この場合はバッファリングされていない出力のみが必要なので、次のように短縮できます。

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}')

関連情報