![Paste 및 awk를 사용하여 실시간으로 sar 샘플 형식 지정](https://linux55.com/image/70190/Paste%20%EB%B0%8F%20awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%9C%BC%EB%A1%9C%20sar%20%EC%83%98%ED%94%8C%20%ED%98%95%EC%8B%9D%20%EC%A7%80%EC%A0%95.png)
라이브 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
두 번째 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
붙여넣기만 사용하여 두 개의 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
정답은파이프라인에서 버퍼링 끄기사용할 수 있는 여러 가지 기술을 제공합니다. 주요 아이디어는 대화형 터미널(예: 파이프)에 연결되지 않은 명령이 버퍼링을 사용한다는 것입니다. 다른 버퍼링 설정으로 다른 명령을 실행할 수 있는 명령 중 하나는 GNU coreutils stdbuf
명령입니다. 이를 사례에 적용하고 각 명령을 버퍼링 해제할 수 있습니다.
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}')