Ich habe ein ziemlich seltsames Problem, ich führe ein Skript (Bash) auf mehreren Servern aus und es funktioniert nicht mehr auf einem der Server (funktioniert einwandfrei auf allen anderen Servern).
Hier ist der problematische Teil des Skripts: (Ich habe es nicht selbst geschrieben, alle Credits gehen an "Rich") ( http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios-) und-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
Komplette Fehlermeldung:
./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
Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen und ich werde versuchen, diese so schnell wie möglich bereitzustellen.
Schätzen Sie alle Eingaben :)
${result%%.*}
wäre die richtige erweiterung um hier den dezimalpunkt zu entfernen. Beachten Sie jedoch, dass diescut -c -2
auch zu Problemen mit Zahlen von 100 oder mehr führt. Es ist daher sicherer, das Programm vollständig fallen zu lassen.Wie es aussieht, enthält Ihre
result
Variable.
nach der Zahl, die die Bash auslöst, ein, das sie nicht als solches erkennt. Sie können den Fehler reproduzieren, indem Sie einfach Folgendes tun:Wenn Sie Ihrer Frage mehr Skript hinzufügen, kann ich vorschlagen, woher dies kommen könnte.
Aktualisieren
Wenn ich mir das vollständige Skript anschaue, würde ich einfach die folgende Zeile ersetzen:
Mit:
Da
used
undtotal
sind ganze Zahlen undbash
Ganzzahlarithmetik, beachten Sie jedoch, dass die Verschiebung der Multiplikation 100 zu Beginn ist. Oder wenn Sie eine korrekte Rundung sicherstellen möchten (die Ganzzahldivision rundet beim Rechnen immer effektiv ab):Dadurch wird sichergestellt, dass keine nachgestellten Punkte enthalten sind
result
. Die Verwendung des Ansatzescut
ist keine sehr gute Idee, da er nur für Ergebnisse im Bereich von 10 bis 99 gilt. Es wird für eineresult
von 0-9 (wie in Ihrem Fall) und auch Zahlen über 99 fehlschlagen .Update 2
Nach dem Kommentar von @ Stephane ist es besser, beim Vergleich mit Schwellenwerten abzurunden. In Anbetracht dessen gibt es einen weiteren kleinen Fehler mit dem Snippet in der Frage - beachten Sie die Inkonsistenz zwischen den Vergleichen, die für das
warn_level
und das verwendet werdencritical_level
. Die Vergleiche fürwarn_level
sind korrekt,critical_level
verwenden jedoch-le
(weniger oder gleich) anstelle von-lt
(nur weniger). Überlegen Sie, wannresult
etwas größer ist alscritical_level
- es wird abgerundet,critical_level
und die kritische Warnung wird nicht ausgelöst, obwohl dies der Fall sein sollte (und dies würde der Fall sein, wenn ein-lt
Vergleich verwendet würde).Vielleicht kein großes Problem, aber hier ist der korrigierte Code:
Die
-ge
Tests sind auch überflüssig, da diese Fälle beim Erreichen deselif
/ impliziert sindelse
, also entfernt wurden.quelle
result=$(( 100 * $used / $total ))
in Ordnung sein.Daher weiß ich überhaupt nicht, wie ich es richtig anwenden soll
awk
. Aber ich weiß, dass das, was in dem von Ihnen verlinkten Skript vor sich geht, eine Menge Unsinn ist und dass etwas wie das Folgende funktionieren sollte. Es tut mir leid, dass ich das nicht perfekt ausschreiben kann, aber da Sie bereits anrufenawk
- zweimal, so scheint es - sollten Sie so etwas verwenden.quelle