ライブ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}')