やや奇妙な問題が発生しました。複数のサーバーでスクリプト(Bash)を実行していますが、そのうちの1つで動作が停止しました(他のすべてのサーバーでは正常に動作しています)。
スクリプトで問題となる部分は次のとおりです。 (私が直接書いたわけではなく、すべてのクレジットは「リッチ」に移動します。)(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
完全なエラーメッセージ:
./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
より多くの情報が必要な場合は、お知らせください。できるだけ早くご提供いたします。
すべてのコメントをお寄せいただきありがとうございます:)
ベストアンサー1
見かけ上のresult
変数.
の後に数字があるため、bashは認識できません。次の手順でエラーを再現できます。
[ 7. -gt 1 ]
質問にさらにスクリプトを追加すると、このコンテンツがどこから来るのかを提案できます。
修正する
スクリプト全体を見ると、次の行を置き換えました。
result=$(echo "$used / $total * 100" |bc -l|cut -c -2)
そして:
result=$(( 100 * used / total ))
used
和total
は整数なので整数bash
算術が行われますが、乗算のシフトは最初から100です。または、正しい丸めを保証したい場合(計算の「整数除算」は常に効果的に丸められます):
result=$( printf '%.0f' $(echo "$used / $total * 100" | bc -l) )
これにより、末尾の点がないことを確認できますresult
。使用された方法はcut
10〜99の範囲の結果でのみ機能するため、良い考えではありません。result
あなたの場合のように、0-9と99以上の数字は失敗します。
アップデート2
~から@Stephaneのコメントは次のとおりです、しきい値と比較するときは丸めするのが最善です。これを念頭に置いて、質問のコードスニペットに別の小さなバグがあります。とで使用されているwarn_level
比較間の不一致に注意してくださいcritical_level
。比較はwarn_level
正確ですが(ただ小さい)代わりに(小さいか等しい)をcritical_level
使用してください。以下より少し大きい場合を考えてください。丸める必要がありますが、重要な警告は発生しません(比較が使用されている場合に発生します)。-le
-lt
result
critical_level
critical_level
-lt
大きな問題ではないかもしれませんが、修正されたコードは次のとおりです。
if [ "$result" -lt "$warn_level" ]; then
echo "Memory OK. $result% used."
exit 0;
elif [ "$result" -lt "$critical_level" ]; then
echo "Memory WARNING. $result% used."
exit 1;
else
echo "Memory CRITICAL. $result% used."
exit 2;
fi
これらのテストは到着時に暗黙的-ge
に発生し、重複して削除されました。elif
else