Kesalahan ini disebabkan oleh salah satu argumen untuk -ge
tidak menjadi numerik. Karena $ALERT
selalu numerik, $usep
harus menjadi biang keladinya. Ada beberapa masalah dengan cara Anda mem-parsing output dh
yang mengakibatkan $usep
tidak menjadi numerik.
Bergantung pada panjang sistem file, dh
dapat membagi outputnya pada beberapa baris. Garis sebagian akan ditangkap di filter Anda dan menghasilkan data yang tidak masuk akal. Untuk menghindari perilaku ini dan mendapatkan hasil parseable dari dh
, lulus -P
opsi.
Juga df
mencetak baris header yang sekali lagi akan menghasilkan data yang tidak masuk akal.
Filter Anda cukup rumit. Saya akan menggunakan satu lulus awk. Untuk itu, Anda bisa melakukan penyaringan pada persentase di dalam awk (tapi saya belum melakukannya dalam skrip berikut).
df -H | awk '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
if [ "$percentage" -ge "$ALERT" ]; then
mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
fi
done
NR==1
cocok dengan baris pertama, jadi NR==1 {next}
lewati baris pertama. Beberapa baris berikutnya mengecualikan beberapa sistem file (perhatikan bahwa deskripsi Anda mengatakan bahwa Anda tertarik abc:/xyz/pqr
, tetapi kode Anda mengecualikannya). Baris awk terakhir menghapus %
dari kolom persentase sebelum mencetaknya.
Akan lebih baik untuk mengirim satu email tentang semua sistem file. Kali ini saya melakukan semua analisis dalam awk.
message=$(df -h | awk -v ALERT="$ALERT" '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5)}
$5 >= ALERT {printf "%s is almost full: %d%%\n", $1, $5}
')
if [ -n "$message" ]; then
echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi