Mam dość dziwny problem, uruchamiam skrypt (Bash) na wielu serwerach i przestał on działać na jednym z serwerów (działa idealnie na wszystkich innych serwerach).
Oto część problemu w skrypcie: (nie napisałem go sam, wszystkie napisy trafiają do „Rich”) ( http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- i-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
Pełny komunikat o błędzie:
./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
Jeśli potrzebujesz więcej informacji, daj mi znać, a ja postaram się je jak najszybciej dostarczyć.
Doceń wszystkie dane wejściowe :)
${result%%.*}
byłoby poprawnym rozwinięciem, aby usunąć tutaj przecinek dziesiętny. Pamiętaj jednak, żecut -c -2
spowoduje to również problemy z liczbą 100 lub więcej, więc bezpieczniej jest całkowicie ją upuścić.Wygląda na to, że twoja
result
zmienna ma w sobie znak.
po tym, że bash nie rozpoznaje go jako takiego. Możesz odtworzyć błąd, wykonując po prostu:Jeśli dodasz więcej skryptu do swojego pytania, | mogę zasugerować, skąd to może pochodzić.
Aktualizacja
Patrząc na pełny skrypt, po prostu zastąpiłbym wiersz:
Z:
Ponieważ
used
itotal
są liczbami całkowitymi ibash
wykonują arytmetykę liczb całkowitych, należy jednak pamiętać, że przesunięcie mnożenia wynosi 100 na początek. Lub jeśli chcesz zapewnić prawidłowe zaokrąglanie („dzielenie liczb całkowitych” w obliczeniach zawsze skutecznie zaokrągla w dół):Zapewni to, że nie będzie żadnych końcowych kropek
result
. Zastosowanie podejściacut
nie jest zbyt dobrym pomysłem, ponieważ jest ważne tylko dla wyniku z zakresu 10–99. Nie powiedzie się toresult
od 0-9 (jak w twoim przypadku), a także liczb powyżej 99.Aktualizacja 2
Z komentarza @ Stephane poniżej , lepiej zaokrąglić w dół, porównując do progów. Biorąc to pod uwagę, istnieje kolejny mały błąd z fragmentem kodu w pytaniu - zauważ niespójność między porównaniami zastosowanymi dla
warn_level
icritical_level
. Porównania dlawarn_level
są poprawne, alecritical_level
wykorzystuje-le
(mniejsze lub równe) zamiast-lt
(tylko mniejsze). Zastanów się, kiedyresult
jest nieco większy niżcritical_level
- zostanie zaokrąglony w dółcritical_level
i nie wywoła krytycznego ostrzeżenia, nawet jeśli powinien (i zrobiłby to, gdyby zastosowano-lt
porównanie).Być może nie stanowi to większego problemu, ale oto poprawiony kod:
Te
-ge
testy są także zbędne, ponieważ te przypadki są regulowane przy osiągnięciuelif
/else
, więc zostały usunięte.źródło
result=$(( 100 * $used / $total ))
powinno być dobrze.Więc nie wiem, jak
awk
bardzo dobrze korzystać. Wiem jednak, że to, co dzieje się w skrypcie, który podłączyłeś, to dużo bzdur i że coś takiego jak poniżej powinno działać. Przepraszam, że nie mogę napisać tego idealnie, ale skoro już dzwoniszawk
- wydaje się, że dwa razy - powinieneś używać czegoś takiego.źródło