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

두 번째 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}')

관련 정보