J'ai un problème assez étrange, j'exécute un script (Bash) sur plusieurs serveurs et il a cessé de fonctionner sur l'un des serveurs (fonctionne parfaitement bien 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- and-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 :)
${result%%.*}
serait l'expansion correcte pour supprimer le point décimal ici. Mais notez quecut -c -2
cela entraînera également des problèmes avec des nombres de 100 ou plus, il est donc plus sûr de le supprimer complètement.Au vu des choses, votre
result
variable a un.
dedans après que le nombre faisant bash ne le reconnaisse pas comme tel. Vous pouvez reproduire l'erreur en faisant simplement:Si vous ajoutez plus de script à votre question, | je peux suggérer d'où cela pourrait provenir.
Mise à jour
En regardant le script complet, je remplacerais simplement la ligne:
Avec:
Puisque
used
ettotal
sont des entiers etbash
fait de l'arithmétique entière, notez bien que le décalage de la multiplication soit de 100 au début. Ou si vous voulez assurer un arrondi correct (la «division entière» dans l'informatique arrondit toujours efficacement):Cela garantira qu'il n'y a pas de points de fuite
result
. L'approche à l'aidecut
n'est pas une très bonne idée car elle n'est valable que pour un résultat compris entre 10 et 99. Il échouera pour unresult
de 0 à 9 (comme dans votre cas) et également des nombres supérieurs à 99.Update 2
D'après le commentaire de @ Stephane ci - dessous , il vaut mieux arrondir en comparant avec les seuils. Compte tenu de cela, il y a une autre petite erreur avec l'extrait de code dans la question - notez l'incohérence entre les comparaisons utilisées pour le
warn_level
et lecritical_level
. Les comparaisons pourwarn_level
sont correctes, maiscritical_level
utilise-le
(moindre ou égal) au lieu de-lt
(juste moindre). Considérez quandresult
est légèrement plus grand quecritical_level
- il sera arrondi àcritical_level
et ne déclenchera pas l'avertissement critique même s'il le devrait (et le ferait si une-lt
comparaison était utilisée).Peut-être pas beaucoup de problème, mais voici le code corrigé:
Les
-ge
tests sont également redondants car ces cas sont implicites pour atteindre leelif
/else
, ils ont donc été supprimés.la source
result=$(( 100 * $used / $total ))
devrait donc être très bien.Je ne sais donc pas
awk
très bien comment l'utiliser . Mais je sais que ce qui se passe dans le script que vous avez lié est beaucoup de non-sens et que quelque chose comme ce qui suit devrait fonctionner. Je suis désolé, je ne peux pas écrire cela parfaitement bien, mais puisque vous appelez déjàawk
- deux fois il semble - vous devriez utiliser quelque chose comme ça.la source