운영 체제: 데비안 8 x64
5초마다 CPU 비율을 다음 형식의 CSV 파일에 기록하고 싶습니다.
YYYY-MM-DD HH:MM:SS,CPU%
top
나는 awk/grep을 사용하여 ((us+sy)/(us+sy+id)*100)을 계산하기 위해 이 프로그램을 사용하는 방법에 익숙하지 않습니다 . 당신이 도울 수 있기를 바랍니다.
검색을 통해 사람들이 top -bn1과 top -bn2를 사용하는 몇 가지 예를 보았습니다. 그러나 내 루프가 top을 호출하면 배치 모드를 전혀 사용할 필요가 없다고 생각합니다.
이것은 제가 작성하기 시작한 쉘 스크립트입니다.
#!/bin/bash
while sleep 5; do "top | grep "Cpu(s)" | awk '{}' >> cpu.csv; done
답변1
다음과 같은 방법으로 이 작업을 수행할 수 있습니다 vmstat
.
#!/usr/bin/perl
open VMSTAT, "vmstat 5|";
<VMSTAT>; <VMSTAT>; # skip the header
while (<VMSTAT>) {
@now = split;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime (time);
printf "%d-%02d-%02d %02d:%02d:%02d,%d%\n", $year+1900, $mon, $mday, $hour, $min, $sec,
$now[12] + $now[13];
}
대부분의 코드는 날짜를 인쇄하는 데 사용됩니다.
답변2
1) 다음 두 버전을 비교해 보겠습니다.
while sleep 0.1 ; do top -d 10 | grep Cpu ; done
#versus batch mode
while sleep 0.1 ; do top -d 10 -bn1 | grep Cpu ; done
top
첫 번째 예에서는 시간이 업데이트 간격(10초로 설정 -d 10
)으로 정의되는 반면 두 번째 예에서는 sleep
while 루프의 명령이 제한임을 알 수 있습니다. 또한 첫 번째 예에서는 top
결코 완료되지 않습니다 . 이는 프로그램 읽기가 "프로세스 종료" 신호를 얻지 못하기 때문에 파이프된 출력을 처리하는 데 문제가 됩니다. 이는 stin
특히 문제가 되는 열 기반 프로그램에 유용하지 않습니다. 예를 들어 방법을 확인하세요.awk
cut
top -d 0.1 -b | grep Cpu | cut -d' ' -f1
간격을 두고 출력을 생성하는 대신 top
불규칙한 배치로 출력을 생성합니다.
while sleep 0.1 ; do top -bn1 | grep Cpu | cut -d' ' -f1 ; done
원하는 간격으로 출력을 생성합니다.
간단히 말해서: while
루프를 사용하고top -bn1
2) awk
처리:
stin
읽은 내용을 사용하면 top -bn1 | grep Cpu
다음을 사용할 수 있습니다.
awk 'BEGIN { FS == " +" } ; { cmd1="date +%Y-%m-%d" ; cmd2="date +%H:%M:%S" ; while ( cmd1 | getline a ) ; while ( cmd2 | getline b) ; print a,b,($2+$4)/($2+$4+$8)*100"%" }'
BEGIN { FS == " +" }
하나 이상의 ( ) 공백이 필드 구분 기호로 사용되므로 us +
, sy 및 id에 해당하는 필드는 $2, $4 및 $8입니다.
해결책은 cmd1="..." ; while ( cmd1 | getline a)
awk에서 시스템 호출 결과를 변수로 읽는 것입니다. @ghostdog74의 답변 보기여기
답변3
나는 제안된 솔루션이 약간 지나쳤다고 말하고 싶습니다. 이것이 작동해야합니다 ...
echo $(date +'%Y-%m-%d %H:%M:%S,' && uptime | awk '{print "CPU: " $9*100 "%"}' ) >> myfile.csv
물론, 원하는 수면 시간과 함께 while 루프에 넣으세요.
이는 "상위" 로드와 동일한 "uptime" 명령에서 CPU 로드를 가져와서 파일에 추가합니다.
BR, 콘텐츠