Saya mengalami masalah yang agak aneh, saya menjalankan skrip (Bash) di beberapa server dan berhenti bekerja di salah satu server (berfungsi dengan sangat baik di semua server lain).
Inilah bagian masalah dari skrip: (Saya tidak menulisnya sendiri, semua kredit menjadi "Kaya") ( http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- dan-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
Pesan kesalahan lengkap:
./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
Jika Anda memerlukan info lebih lanjut, beri tahu saya dan saya akan mencoba menyediakannya secepat mungkin.
Hargai semua input :)
${result%%.*}
akan menjadi ekspansi yang benar untuk menghilangkan titik desimal di sini. Tetapi perhatikan bahwa halcut -c -2
itu juga akan menyebabkan masalah dengan angka 100 atau lebih, sehingga lebih aman untuk menjatuhkannya sepenuhnya.Dari tampilan hal-hal,
result
variabel Anda memiliki.
di dalamnya setelah angka membuat bash tidak mengenalinya. Anda dapat mereproduksi kesalahan hanya dengan melakukan:Jika Anda menambahkan lebih banyak skrip ke pertanyaan Anda, | Saya dapat menyarankan dari mana asalnya.
Memperbarui
Melihat skrip lengkap, saya hanya akan mengganti baris:
Dengan:
Karena
used
dantotal
adalah bilangan bulat danbash
melakukan bilangan bulat aritmatika, meskipun perhatikan bahwa pergeseran perkalian menjadi 100 ke awal. Atau jika Anda ingin memastikan pembulatan yang benar ('divisi integer' dalam komputasi selalu dibulatkan secara efektif):Ini akan memastikan bahwa tidak ada titik tertinggal di
result
. Pendekatan menggunakancut
bukan ide yang sangat bagus karena hanya valid untuk hasil di kisaran 10-99. Ini akan gagal untukresult
dari 0-9 (seperti dalam kasus Anda) dan juga angka di atas 99.Perbarui 2
Dari komentar @ Stephane di bawah ini , Anda lebih baik membulatkannya saat membandingkan dengan ambang batas. Mempertimbangkan hal ini, ada kesalahan kecil lainnya pada cuplikan dalam pertanyaan - perhatikan ketidakkonsistenan antara perbandingan yang digunakan untuk
warn_level
dancritical_level
. Perbandingan untukwarn_level
benar, tetapicritical_level
menggunakan-le
(lebih kecil atau sama) bukan-lt
(hanya lebih sedikit). Pertimbangkan kapanresult
sedikit lebih besar daricritical_level
- itu akan dibulatkan ke bawahcritical_level
dan tidak memicu peringatan kritis meskipun seharusnya (dan akan jika-lt
perbandingan digunakan).Mungkin tidak banyak masalah, tapi ini kode yang diperbaiki
The
-ge
tes juga berlebihan karena kasus-kasus ini tersirat pada mencapaielif
/else
, sehingga telah dihapus.sumber
result=$(( 100 * $used / $total ))
harus baik-baik saja.Jadi saya tidak tahu bagaimana menggunakannya dengan
awk
sangat baik. Tetapi saya tahu bahwa apa yang terjadi dalam skrip yang Anda tautkan adalah omong kosong dan sesuatu seperti yang berikut ini akan berfungsi. Maaf saya tidak bisa menulis ini dengan baik, tetapi karena Anda sudah meneleponawk
- sepertinya dua kali - Anda harus menggunakan sesuatu seperti ini.sumber