안정성 테스트 중에 CPU 및 메모리 사용률을 모니터링하는 스크립트를 작성 중이며 최종적으로는 이를 차트나 기타 시각화 도구로 표시하고 싶습니다. 이를 위해 열 이름으로 상위 명령에서 %CPU 및 %MEM을 추출하려고 했습니다.
##to get indexes of columns I need
indexCPU=$(top -b -n 1 | grep PID | tr -s ' ' '\n' | nl -nln | grep "%CPU" | cut -f1)
infexMEM=$(top -b -n 1 | grep PID | tr -s ' ' '\n' | nl -nln | grep "%MEM" | cut -f1)
## get values from top in a while loop
while [ $UPTIME -lt $DURRATION ]; do
scpu=$(top -b -n 1| grep -w squeezer | tr -s ' ' | cut -d ' ' -f $indexCPU )
smem=$(top -b -n 1| grep -w squeezer | tr -s ' ' | cut -d ' ' -f $infexMEM )
echo "$scpu $smem" >> stabilityTestUsageM.txt
sleep 300
done
이제 이 작업을 수행하면 때로는 올바른 값을 얻지만 다른 경우에는 왼쪽 값을 얻습니다.
예를 들어, 출력을 얻었습니다.
S
이를 위해:
top -b -n 1| grep -w squeezer | tr -s ' ' | cut -d ' ' -f $indexCPU
이것은 top -b -n 1| grep -w 압출기의 결과입니다.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8048 root 20 0 1953716 442376 8460 S 0.0 2.7 0:30.97 squeezer
무엇이 문제인지 아시나요?
감사해요
답변1
top
접근 방식의 문제점은 필드 nr을 식별하는 첫 번째 단계에서 개수에서 "null 필드"(출력에서 선행 공백으로 생성됨)를 생략한다는 것입니다. 그러나 cut
구분 기호를 단일 공백으로 설정하면 공백으로 시작하는 줄의 시작 부분에 빈 필드가 있는 것으로 해석됩니다. 따라서 귀하가 결정한 필드 번호는 nl -nln
필드 계산 방식에 비해 1이 적습니다.cut
그러나 일반적으로 다음을 권장합니다 awk
.
top -b -n 1 | awk '$NF=="squeezer" {print $9}'
마지막 공백으로 구분된 필드(명령어)가 "squeezer"인 줄의 9번째 필드(CPU 사용량)가 인쇄되어야 합니다.
쉽게 결정할 수 있도록 CPU 필드를 이름으로 식별하려면 다음 방법을 사용할 수 있습니다.
top -b -n 1 | awk '!i&&/PID/{for (i=1;i<=NF;i++) {if ($i=="%CPU") break}} '$NF=="squeezer" {print $i}}'
이는 먼저 열 헤더를 포함하는 행의 모든 필드를 반복하고 PID
읽은 필드(따라서 관련 필드 번호를 포함함)에 도달하면 루프를 중단합니다. 그런 다음 마지막 필드가 구문 분석하려는 명령인 줄의 필드를 인쇄합니다. 안전 조치로 문자열이 포함된 첫 번째 줄만 고려됩니다(프로세스 이름에도 문자열이 포함될 수 있는 경우).%CPU
i
PID
이 매우 간단한 접근 방식은 인수 없이 명령을 나열할 때만 작동합니다. 즉, 공백으로 구분된 마지막 필드는 실제로 명령줄 인수가 아닌 명령일 뿐입니다.
다른 부분에 대해서는 사이트 가이드라인에 따라 별도의 질문을 하셔야 합니다.