J'ai un problème plutôt bizarre, j'exécute un script (Bash) sur plusieurs serveurs et il a cessé de fonctionner sur l'un des serveurs (fonctionne parfaitement sur tous les autres serveurs).
Voici la partie problématique du script :(Je ne l'ai pas écrit moi-même, tous les crédits vont à "Rich") (http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- et-nrpe/)
if [ "$result" -lt "$warn_level" ]; then #Line 56
echo "Memory OK. $result% used."
exit 0;
elif [ "$result" -ge "$warn_level" ] && [ "$result" -le "$critical_level" ]; then #Line 59
echo "Memory WARNING. $result% used."
exit 1;
elif [ "$result" -gt "$critical_level" ]; then #Line 62
echo "Memory CRITICAL. $result% used."
exit 2;
fi
Message d'erreur complet :
./check_memory.sh: Line 56: [: 7.: integer expression expected
./check_memory.sh: Line 59: [: 7.: integer expression expected
./check_memory.sh: Line 62: [: 7.: integer expression expected
Si vous avez besoin de plus d'informations, faites-le moi savoir et j'essaierai de vous les fournir le plus rapidement possible.
Appréciez toutes les entrées 🙂
Réponse acceptée :
À partir du lien que vous avez fourni, je vois la ligne ci-dessous.
result=$(echo "$used / $total * 100" |bc -l|cut -c -2)
Selon le commentaire de @ Graeme, remplacez la ligne ci-dessus par ci-dessous.
result=$(echo "$used / $total * 100" |bc -l)
Maintenant, après avoir ajouté la ligne ci-dessus, nous devons modifier la sortie du result
en entier comme ci-dessous.
result1=${result/.*}
Je suppose que dans l'une des machines où l'erreur se produit, cette sortie n'est pas un entier. Convertissez simplement la sortie du résultat en entier afin de pouvoir gérer de tels cas. Ajoutez la ligne ci-dessous après avoir calculé le result
.
result1=${result/.*}
Et au lieu de result
changer les noms de variables en tant que result1
à l'intérieur du if
boucles, et l'erreur ne se produira pas.
Je soupçonne que le cut -c -2
attribue à l'erreur principalement car il ne coupe que les 2 premiers caractères. Et si le résultat n'a qu'un seul caractère ? Supposons que le résultat soit 1.23456
, la coupe ci-dessus donnera 1.
comme valeur pour result
qui est évidemment la cause de l'integer expected
erreur.
La raison pour laquelle il fonctionne correctement sur les serveurs restants est qu'il n'a pas rencontré de cas où le result
variable n'a qu'un seul chiffre. Il est fort probable qu'il échoue également sur les serveurs restants si le résultat est une variable à un chiffre (quelque chose comme je l'ai mentionné dans l'exemple ci-dessus).