Script shell untuk mengirim email peringatan jika penggunaan disk melebihi 90%


11

Saya ingin menerapkan skrip di server saya yang secara otomatis akan mengirimkan peringatan email jika penggunaan disk lebih dari 90% dan peringatan email kedua saat lebih dari 95%. Sistem file saya adalah abc:/xyz/abcdan titik mount adalah /pqr.

Saya sudah mencoba ini:

ADMIN="someone@def.com" 
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 kesalahan yang mengatakan

line 7: [: Use: integer expression expected 

Jawaban:


13

Kesalahan ini disebabkan oleh salah satu argumen untuk -getidak menjadi numerik. Karena $ALERTselalu numerik, $usepharus menjadi biang keladinya. Ada beberapa masalah dengan cara Anda mem-parsing output dhyang mengakibatkan $useptidak menjadi numerik.

Bergantung pada panjang sistem file, dhdapat 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 -Popsi.

Juga dfmencetak 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==1cocok 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 

6

Jika Anda mengubah cetak menjadi printf menggunakan% d, persentase akan menjadi bilangan bulat. Mencoba:

printf("%d", $5);

yang akan mengubah 91% menjadi 91. Jadi perintah terakhir adalah ini:

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'

Perintah di atas dalam bahasa Inggris: "Dapatkan penggunaan ruang disk dalam format yang dapat dibaca manusia. Saring dengan grep ke disk yang ingin kita lihat. Pipa yang baris untuk awk dan mencetak kata ke-5 dibatasi oleh ruang (kosong dihapus), dan format string yang dihasilkan sebagai integer. Bagi saya perintah mengembalikan integer 78yang berarti disk adalah 78% penuh.


3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 mengambil semua output setelah melewatkan 2 baris pertama
  • sed s/%//g menghilangkan tanda persen
  • awk ... mencetak "Alert ..." jika bidang ke-5 dalam output adalah angka yang lebih besar dari 90

1
Selamat Datang di Stack Exchange! Kami mencari jawaban panjang yang memberikan penjelasan dan konteks. Jangan hanya memberikan jawaban satu baris; jelaskan cara kerjanya. Jawaban yang tidak termasuk penjelasan dapat dihapus.
G-Man Mengatakan 'Reinstate Monica'

0

inilah varian saya:

#!/bin/bash

ADMIN=yermail@yerdom.com
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom|Used' | awk '{ print $5 " " $1 }' | while read output; do 
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
echo $usep
partition=$(echo $output | awk '{ print $2 }' ) 
if [ $usep -ge $ALERT ]; then 
  echo  "Alert: Almost out of disk space $usep" 
  df -H | mail -s "Alert: out of disk space $usep"  $ADMIN
fi 
done

0

Saya tidak dapat mengomentari jawaban Gilles di atas, tetapi perlu diketahui bahwa awk melakukan perbandingan berbasis string di bagian kedua, di mana:

$5 >= ALERT

Saya perhatikan ini ketika saya menguji ambang satu digit. Anda bisa memaksa pemain ke int dengan menggunakan +0, sehingga perbandingannya menjadi:

$5+0 >= ALERT
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.