त्रुटि -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