Disk kullanımı% 90'ı aşarsa uyarı postası göndermek için kabuk komut dosyası


11

Sunucumda, disk kullanımı% 90'ın üzerine çıktığında otomatik olarak e-posta uyarıları ve% 95'in üzerine çıktığında ikinci e-posta uyarısı gönderecek bir komut dosyası uygulamak istiyorum. Dosya sistemim abc:/xyz/abcve bağlama noktası /pqr.

Bunu denedim:

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

Ama şöyle bir hata alıyorum:

line 7: [: Use: integer expression expected 

Yanıtlar:


14

Hata, bağımsız değişkenlerden -gebirinin sayısal olmamasından kaynaklanmaktadır. Yana $ALERThep sayısal, $usepsuçlu olmak zorunda. Çıktısını ayrıştırma yönteminizde sayısal olmayan dhsonuçlarla ilgili birkaç sorun vardır $usep.

Dosya sistemlerinin uzunluğuna bağlı olarak, dhçıktısını birkaç satıra bölebilir. Kısmi satırlar filtrenize takılır ve saçma verilerle sonuçlanır. Bu davranışı önlemek ve ayrıştırılabilir çıktı almak dhiçin -Pseçeneği iletin .

Ayrıca dfyine saçma verilerle sonuçlanacak bir başlık satırı yazdırır.

Filtreniz oldukça karmaşık. Ben awk tek bir geçiş kullanmak istiyorum. Bu nedenle, awk içindeki yüzde üzerinde filtreleme yapabilirdiniz (ancak aşağıdaki komut dosyasında yapmadım).

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==1ilk satırla eşleştiğinden ilk satırı NR==1 {next}atlar. Sonraki birkaç satır bazı dosya sistemlerini hariç tutar (açıklamanızın ilgilendiğinizi söylüyor abc:/xyz/pqr, ancak kodunuzun hariç tuttuğunu unutmayın). Son awk satırı %yazdırmadan önce yüzde sütunundan kaldırır .

Tüm dosya sistemleri hakkında tek bir posta göndermek daha iyi olur. Bu sefer tüm analizi awk olarak yapıyorum.

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

% D kullanarak yazdırmayı printf olarak değiştirirseniz, yüzde bir tamsayı olur. Deneyin:

printf("%d", $5);

Bu da% 91'i 91'e dönüştürecek. Son komut şudur:

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

Yukarıdaki komut ingilizce: "Disk alanı kullanımını okunabilir biçimde alın. Göz atmak istediğimiz diske grep ile filtre uygulayın. Bu satırı awk'a ekleyin ve boşlukla sınırlandırılmış 5. kelimeyi (boşluklar kaldırıldı) ve formatı yazdırın Benim için komut tamsayı döndürür, 78bu da diskin% 78 dolu olduğu anlamına gelir.


3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 ilk 2 satırı atladıktan sonra tüm çıktıları alır
  • sed s/%//g yüzde işaretleri şeritler
  • awk ... Çıktıdaki 5. alan 90'dan büyük bir sayı ise "Uyarı ..."

1
Stack Exchange'e hoş geldiniz! Bazı açıklama ve bağlam sağlayan uzun cevaplar arıyoruz. Sadece tek satırlık bir cevap vermeyin; nasıl çalıştığını açıklar. Açıklama içermeyen yanıtlar kaldırılabilir.
G-Man

0

İşte benim varyanım:

#!/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

Yukarıdaki Gilles yanıtı hakkında yorum yapamıyorum, ancak awk'ın ikinci bölümde dize tabanlı bir karşılaştırma yaptığını unutmayın:

$5 >= ALERT

Tek basamaklı eşikleri test ederken bunu fark ettim. +0 kullanarak oyuncu kadrosunu int'e zorlayabilirsiniz, böylece karşılaştırma yapılır:

$5+0 >= ALERT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.