CPU 사용량이 80% 미만일 때 10분마다 명령을 실행하려고 합니다. 나는 bash 스크립팅에 익숙하지 않습니다. 총 CPU 사용량을 구하는 방법을 찾았습니다.`` top -b -n1 | grep "CPU" | awk '{print $2 + $4}'' 그런 다음 최대값인 80%와 비교하고 싶습니다. 그런데 왜 둘을 비교할 수 없는지 모르겠습니다. 스크립트는 다음과 같습니다.
#!/bin/bash
MAX=80
CPU=`top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`
while true
do
if $CPU < $MAX
then
echo $CPU # This is an example
CPU=`top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`
sleep 10m
fi
done
숫자가 명령으로 해석되어 스크립트가 실패합니다... ( ) 왜 컴파일 cannot open 80: No such file
할 수 없나요 ? 이 문제를 어떻게 해결하시겠습니까?$MAX
$CPU
미리 감사드립니다.
답변1
<
에 사용됩니다
리디렉션. 정수를 비교해야 하는 경우:
if [ "$MAX" -gt "$CPU" ]
그러나 $CPU
부동 소수점 숫자일 수도 있습니다. Bash는 부동 소수점 숫자에 대해 직접 작동할 수 없으므로 다음을 사용해야 합니다 bc
.
if [ "$(bc -l <<< "${CPU} > ${MAX}")" -eq 1 ]
$(..)
대신에 양식을 사용해야 합니다 .레거시 백틱CPU
while 루프 내에서는 한 번만 할당 할 수 있습니다 .
#!/bin/bash
MAX=80
while true
do
CPU="$(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}')"
if [ "$(bc -l <<< "${CPU} > ${MAX}")" -eq 1 ]
then
echo "$CPU" # This is an example
sleep 10m
fi
done
답변2
top(1)
이 문제를 해결하는 가장 좋은 방법은 아닙니다. 이것은 필요한 것보다 훨씬 더 많은 것을 스캔하는 매우 무거운 측정 도구입니다. 또한 순간적인 값에 중점을 두는데 여기서는 올바르지 않습니다.
대신에 다음을 사용해야 합니다.시스템 부하 평균커널에서 오랫동안 지속적으로 계산되기 때문입니다. 이는 추가 비용이 발생하지 않으므로 측정에 영향을 주지 않으며 통화와 같은 일시적인 변화에 의해 영향을 받지 않는다는 것을 의미합니다 top(1)
!
다음은 로드 평균을 기반으로 다시 작성된 스크립트입니다.
#!/bin/bash
HIGH_LOAD=6 # 80% of an 8-core system; see link above
while true
do
CURR_LOAD=$(cut -f2 -d' ' < /proc/loadavg)
if [ $CURR_LOAD -lt $HIGH_LOAD ]
then
run-background-command
fi
sleep 10m
done
호출이 조건 외부로 sleep
이동되었음을 참고하세요 . 어쨌든 호출을 지연하고 싶었습니다. 부하가 낮은 경우와 부하가 높은 경우에 따라 대기 시간이 달라지도록 재정의를 if
추가할 수도 있습니다 .else
귀하의 버전과 달리 루프 내부와 외부에서 CPU 사용량 확인을 반복하지 않습니다.