Saya ingin menerapkan skrip di server saya yang secara otomatis akan mengirim peringatan email jika penggunaan disk melebihi 90% dan peringatan email kedua ketika melebihi 95%. Sistem file saya adalah abc:/xyz/abc
dan titik pemasangannya adalah /pqr
.
Saya sudah mencoba ini:
ADMIN="[email protected]"
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom' | awk '{ print $5 " " $1 }' | while read output; do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge $ALERT ]; then
mail -s "Alert: Almost out of disk space $usep" $ADMIN
fi
done
Tapi saya mendapatkan pesan kesalahan yang mengatakan
line 7: [: Use: integer expression expected
Jawaban yang Diterima:
Kesalahan ini disebabkan oleh salah satu argumen ke -ge
tidak bersifat numerik. Sejak $ALERT
selalu numerik, $usep
harus menjadi pelakunya. Ada beberapa masalah dengan cara Anda mengurai output dh
yang menghasilkan $usep
bukan numerik.
Bergantung pada panjang sistem file, dh
dapat membagi outputnya pada beberapa baris. Garis parsial akan ditangkap dalam filter Anda dan menghasilkan data yang tidak masuk akal. Untuk menghindari perilaku ini dan mendapatkan keluaran yang dapat diuraikan dari dh
, berikan -P
pilihan.
Juga df
mencetak baris header yang lagi-lagi akan menghasilkan data yang tidak masuk akal.
Filter Anda cukup rumit. Saya akan menggunakan satu pass awk. Untuk itu, Anda bisa melakukan penyaringan pada persentase di dalam awk (tapi saya belum melakukannya di 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}
melewatkan baris pertama. Beberapa baris berikutnya mengecualikan beberapa sistem file (perhatikan bahwa deskripsi Anda mengatakan bahwa Anda tertarik dengan 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