У меня довольно странная проблема, я запускаю скрипт (Bash) на нескольких серверах, и он перестал работать на одном из серверов (прекрасно работает на всех других серверах).
Вот проблемная часть сценария: (я сам не написал, все кредиты идут в «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
Полное сообщение об ошибке:
./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
Если вам нужна дополнительная информация, дайте мне знать, и я постараюсь предоставить ее как можно быстрее.
Цените все материалы :)
${result%%.*}
будет правильным расширением, чтобы удалить десятичную точку здесь. Но обратите внимание, что этоcut -c -2
также вызовет проблемы с числами от 100 и более, поэтому безопаснее полностью его отбросить.Судя по всему, ваша
result
переменная содержит число.
после того, как число, заставляющее bash не распознавать его как таковое. Вы можете воспроизвести ошибку, просто выполнив:Если вы добавите больше сценария к своему вопросу, я могу предложить, откуда это может исходить.
Обновить
Глядя на полный скрипт, я бы просто заменил строку:
С:
Так как
used
иtotal
являются целыми числами иbash
выполняет целочисленную арифметику, хотя обратите внимание, что смещение умножения будет 100 к началу. Или, если вы хотите обеспечить правильное округление («целочисленное деление» в вычислениях всегда эффективно округляет):Это гарантирует, что в нем нет конечных точек
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
сравнении).Возможно, не большая проблема, но вот исправленный код:
Эти
-ge
тесты также излишним , поскольку эти случаи имеются в виду при достиженииelif
/else
, поэтому были удалены.источник
result=$(( 100 * $used / $total ))
должно быть в порядке.Так что я не знаю, как использовать
awk
очень хорошо. Но я знаю, что в сценарии, который вы связали, происходит много глупостей, и что-то вроде следующего должно работать. Извините, я не могу написать это на отлично, но так как вы уже звонитеawk
- кажется, дважды - вам следует использовать что-то подобное.источник