ข้อผิดพลาดเกิดจากหนึ่งในข้อโต้แย้งที่-ge
ไม่ได้เป็นตัวเลข เนื่องจาก$ALERT
เป็นตัวเลขเสมอ$usep
จึงต้องเป็นผู้กระทำผิด มีปัญหาหลายอย่างกับวิธีที่คุณแยกวิเคราะห์ผลลัพธ์dh
ซึ่งทำให้$usep
ไม่ได้เป็นตัวเลข
ขึ้นอยู่กับความยาวของระบบไฟล์dh
อาจแบ่งเอาต์พุตออกเป็นหลายบรรทัด เส้นบางส่วนจะถูกจับในตัวกรองของคุณและส่งผลให้ข้อมูลไร้สาระ เพื่อหลีกเลี่ยงพฤติกรรมนี้และรับเอาต์พุตที่แยกวิเคราะห์ได้dh
ให้ส่ง-P
ตัวเลือก
นอกจากนี้ยังdf
พิมพ์สายหัวอีกครั้งซึ่งจะส่งผลให้ข้อมูลที่ไร้สาระ
ตัวกรองของคุณค่อนข้างซับซ้อน ฉันจะใช้ awk เพียงครั้งเดียว สำหรับเรื่องนั้นคุณสามารถทำการกรองเปอร์เซ็นต์ใน 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 สุดท้ายลบออก%
จากคอลัมน์เปอร์เซ็นต์ก่อนพิมพ์
มันจะดีกว่าถ้าจะส่งเมล์เดียวเกี่ยวกับระบบไฟล์ทั้งหมด เวลานี้ฉันทำการวิเคราะห์ทั้งหมดใน 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