if 문에서 어려움을 겪고 있습니다.
메모리 사용량이나 CPU 사용량이 70%를 초과할 때마다 "시스템 활용도가 높습니다"라는 메시지가 표시되기를 원합니다. 이제 if 문에서 다음 2가지 조건을 시도했지만 오류가 발생합니다.
# This script monitors CPU and memory usage
RED='\033[0;31m'
NC='\033[0m' # No Color
while :
do
# Get the current usage of CPU and memory
limit=70.0
cpuUsage=$(top -bn1 | awk '/Cpu/ { print $2}')
memTotal=$(free -m | awk '/Mem/{print $2}')
memUsage=$(free -m | awk '/Mem/{print $3}')
memUsage=$(( (memUsage * 100) / memTotal ))
# Print the usage
echo "CPU Usage: $cpuUsage%"
echo "Memory Usage: $memUsage%"
# Sleep for 1 second
sleep 1
if (( $(echo "$cpuUsage > $limit ; $memUsage > $limit" |bc -l) ))
then
printf "${RED}The system is highly utilized${NC}\n"
else
echo The system is not highly utilized
fi
done
내가 아는 한 ; 실행은 1번째 조건을 확인한 후 성공 여부와 관계없이 2번째 조건으로 진행됩니다. 어쨌든 이 오류가 발생합니다. 0 : 표현식에 구문 오류가 있습니다(오류 토큰은 "0 "입니다).
답변1
bc
이해 ||
하고 &&
.
if (( $(echo "$cpuUsage > $limit || $memUsage > $limit" | bc -l) ))
답변2
(본 바와 같이) GNU bc(및 busybox bc)에서 논리식을 사용하여 표현식을 결합할 수 있지만 POSIX 1||
에서는 지원되지 않습니다 .
top
이미 awk를 사용하여 및 출력을 구문 분석하고 있으므로 free
다른 접근 방식은 awk에서도 산술 및 관계형 테스트를 수행하는 것입니다. 그런 다음 쉘에서 간단한 정수 비교를 사용할 수 있습니다(bash도 필요하지 않음).
#!/bin/sh
# This script monitors CPU and memory usage
RED='\033[0;31m'
NC='\033[0m' # No Color
limit=${1:-70.0}
while :
do
# Get the current usage of CPU and memory
top -bn1 | awk -v limit="$limit" '
/^%Cpu/ {printf "CPU Usage: %.1f%%\n", $2; exit ($2+0 > limit ? 1 : 0)}
'
cpuHi=$?
free -m | awk -v limit="$limit" '
/^Mem/ {usage = 100*$3/$2; printf "Memory Usage: %.0f%%\n", usage; exit (usage > limit ? 1 : 0)}
'
memHi=$?
sleep 1
if [ "$cpuHi" -ne 0 ] || [ "$memHi" -ne 0 ]
then
printf "${RED}The system is highly utilized${NC}\n"
else
printf "The system is not highly utilized\n"
fi
done
실제로 POSIX bc는 조건부 구문이나 루프 외부의 관계 연산자도 지원하지 않습니다. 예:
$ echo '2 > 1 || 1 > 2' | bc 1
그러나 경고가 활성화된 경우:
$ echo '2 > 1 || 1 > 2' | bc -w (standard_in) 1: (Warning) || operator (standard_in) 2: (Warning) comparison in expression 1
그리고 비지박스(Busybox)도 마찬가지입니다.
$ echo '2 > 1 || 1 > 2' | busybox bc -w bc: POSIX does not allow boolean operators; this is bad: || bc: POSIX does not allow comparison operators outside if or loops 1
답변3
@choroba의 답변을 조금 확장하려면 다음을 수행하십시오.
echo "$cpuUsage > $limit ; $memUsage > $limit" |bc -l
출력됩니다2줄.
시연
$ set -x
+ set -x
$ ans=$(echo "1==1; 2==1" | bc -l)
++ bc -l
++ echo '1==1; 2==1'
+ ans='1
0'
$ if (( $ans )); then echo yes; fi
+ (( 1
0 ))
bash: ((: 1
0 : syntax error in expression (error token is "0 ")