0

CPU負荷が特定の制限を超えた場合、無限ループを遅くしようとしていますが、うまくいかないだけです。以下のコードです。if 条件は常に true になります

c=1
while [ $c -le 1 ]
do
#echo "Welcome $c times"
#php BALHABLH.php

IN=$(cat /proc/loadavg);

set -- "$IN"
IFS=" "; declare -a Array=($*)
echo "${Array[@]}"
echo "${Array[0]}"
echo "${Array[1]}"

#var = ${Array[1]}



x=$(expr "${Array[1]}" )

if [ $x > 0.91 ]
then
    echo "CPU LOAD > 0.91"
    sleep 2
fi


(( c++ ))
done
4

3 に答える 3

2

bc浮動小数点比較に使用(( ... ))し、算術式に使用する必要があります。

if (( $(bc -l <<< "$x > 0.91") == 1 ))

また、使用しないでくださいcat:

IN=$(</proc/loadavg)
于 2013-03-01T16:15:45.960 に答える
0

Bash は整数のみを処理します。フロート パイプを処理するにbcは、次のようにします。

[ $(echo " $x > 0.91" | bc -l) -eq 1 ]

bc1比較が真の場合に返します。1 と比較します (-eq 演算子を使用)。

検証

$ cat test.sh
#!/bin/bash  
x="$1"
if [ $(echo " $x > 0.91" | bc -l) -eq 1 ]; then
   echo greater;
else 
   echo smaller;
fi
$ ./test.sh 0.5
smaller
$ ./test.sh 1.5
greater

次のように、スクリプトを少し単純化することもできます。

#!/bin/bash
c=10
for (( i=1;i<=c;i++ )); do
    load=$(awk '{print $2}' /proc/loadavg)
    echo "$i: load is $load"
    if (( $(echo "$load > 0.91" | bc) == 1 )); then
        echo "CPU LOAD > 0.91"       
        sleep 2
    fi
done
于 2013-03-01T16:14:49.533 に答える
0

Bash は浮動小数点演算を使用できません。次のようなことができます。

if [ $( echo "$x > 0.91" | bc ) -eq 1 ]; then
于 2013-03-01T16:33:07.997 に答える