यदि शेल का उपयोग 90% से अधिक है, तो एक चेतावनी मेल भेजने के लिए शेल स्क्रिप्ट


11

मैं अपने सर्वर पर एक स्क्रिप्ट लागू करना चाहता हूं जो 95% तक जाने पर डिस्क उपयोग 90% से अधिक हो जाए और दूसरा ईमेल अलर्ट हो तो स्वचालित रूप से ईमेल अलर्ट भेजेगा। मेरा फाइलसिस्टम है abc:/xyz/abcऔर आरोह बिंदु है /pqr

मैंने यह कोशिश की है:

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

लेकिन मुझे एक त्रुटि मिल रही है जो कहती है

line 7: [: Use: integer expression expected 

जवाबों:


14

त्रुटि -geसंख्यात्मक नहीं होने के एक तर्क के कारण है । चूंकि $ALERTहमेशा संख्यात्मक होता है, $usepअपराधी होना चाहिए। जिस तरह से आप संख्यात्मक dhपरिणाम $usepनहीं होने के परिणामस्वरूप पार्स करते हैं, उसके साथ कई समस्याएं हैं ।

फाइलसिस्टम की लंबाई के आधार पर, dhइसका उत्पादन कई लाइनों पर विभाजित हो सकता है। आंशिक फ़िल्टर आपके फ़िल्टर में परिणाम और निरर्थक डेटा में पकड़े जाएंगे। इस व्यवहार से बचने और पार्स करने योग्य आउटपुट प्राप्त करने के लिए dh, -Pविकल्प पास करें ।

इसके अलावा dfएक हेडर लाइन प्रिंट करता है जिसके परिणामस्वरूप फिर से निरर्थक डेटा होगा।

आपका फ़िल्टर बहुत जटिल है। मैं जाग के एक पास का उपयोग करेंगे। उस मामले के लिए, आप awk के अंदर प्रतिशत पर फ़िल्टरिंग कर सकते हैं (लेकिन मैंने इसे निम्न स्क्रिप्ट में नहीं किया है)।

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पहली पंक्ति से मेल खाता है, इसलिए NR==1 {next}पहली पंक्ति को छोड़ देता है। अगली कुछ पंक्तियाँ कुछ फाइल सिस्टम को बाहर करती हैं (ध्यान दें कि आपका विवरण कहता है कि आप abc:/xyz/pqrइसमें रुचि रखते हैं , लेकिन आपका कोड इसे छोड़ देता है)। अंतिम 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

यदि आप% d का उपयोग कर प्रिंट को प्रिंटफ में बदलते हैं, तो प्रतिशत पूर्णांक बन जाएगा। प्रयत्न:

printf("%d", $5);

जो 91% को 91 में बदल देगा। तो अंतिम आदेश यह है:

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

उपरोक्त कमांड अंग्रेजी में: "डिस्क पठनीय उपयोग को मानव पठनीय प्रारूप में प्राप्त करें। जिस डिस्क को हम देखते हैं, उसे देखने के लिए grep के साथ फ़िल्टर करें। उस लाइन को जगाने और प्रिंट करने के लिए 5 वें शब्द को सीमांकित करें (रिक्त स्थान हटाए गए), और प्रारूप। एक पूर्णांक के रूप में परिणामी स्ट्रिंग। मेरे लिए कमांड पूर्णांक देता है 78जिसका अर्थ है कि डिस्क 78% पूर्ण है।


3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 पहले 2 लाइनों को लंघन के बाद सभी आउटपुट लेता है
  • sed s/%//g स्ट्रिप्स प्रतिशत संकेत
  • awk ... प्रिंट "चेतावनी ..." यदि आउटपुट में 5 वां क्षेत्र 90 से अधिक की संख्या है

1
स्टैक एक्सचेंज में आपका स्वागत है! हम लंबे उत्तर की तलाश कर रहे हैं जो कुछ स्पष्टीकरण और संदर्भ प्रदान करते हैं। केवल एक-पंक्ति का उत्तर न दें; यह कैसे काम करता है समझाएं। स्पष्टीकरण को शामिल नहीं करने वाले उत्तरों को हटाया जा सकता है।
जी-मैन का कहना है कि 'मोनिका की बहाली'

0

यहाँ मेरा संस्करण है:

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

मैं ऊपर दिए गए उत्तर के बारे में टिप्पणी नहीं कर पा रहा हूं, लेकिन बस ध्यान रखें कि awk दूसरे भाग में एक स्ट्रिंग-आधारित तुलना कर रहा है, जहां:

$5 >= ALERT

मैंने इस पर ध्यान दिया जब मैं एकल-अंक थ्रेसहोल्ड का परीक्षण कर रहा था। आप किसी कास्ट को +0 का उपयोग करके इंट करने के लिए मजबूर कर सकते हैं, इसलिए तुलना हो जाती है:

$5+0 >= ALERT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.