Shell script để gửi thư cảnh báo nếu mức sử dụng đĩa vượt quá 90%


11

Tôi muốn triển khai một tập lệnh trên máy chủ của mình, nó sẽ tự động gửi thông báo qua email nếu việc sử dụng đĩa vượt quá 90% và thông báo email thứ hai khi nó vượt quá 95%. Hệ thống tập tin của tôi là abc:/xyz/abcvà điểm gắn kết là /pqr.

Tôi đã thử điều này:

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

Nhưng tôi nhận được một lỗi nói

line 7: [: Use: integer expression expected 

Câu trả lời:


13

Lỗi là do một trong các đối số -gekhông phải là số. Vì $ALERTluôn luôn là số, $usepphải là thủ phạm. Có một số vấn đề với cách bạn phân tích đầu ra dhdẫn đến kết quả $usepkhông phải là số.

Tùy thuộc vào độ dài của các hệ thống tập tin, dhcó thể phân chia đầu ra của nó trên một số dòng. Các dòng một phần sẽ bị bắt trong bộ lọc của bạn và dẫn đến dữ liệu vô nghĩa. Để tránh hành vi này và nhận đầu ra có thể phân tích cú pháp từ dh, hãy chuyển -Ptùy chọn.

Cũng dfin một dòng tiêu đề một lần nữa sẽ dẫn đến dữ liệu vô nghĩa.

Bộ lọc của bạn khá phức tạp. Tôi sẽ sử dụng một lượt của awk. Đối với vấn đề đó, bạn có thể thực hiện lọc theo tỷ lệ phần trăm bên trong awk (nhưng tôi đã không thực hiện nó trong tập lệnh sau).

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==1phù hợp với dòng đầu tiên, vì vậy NR==1 {next}bỏ qua dòng đầu tiên. Một số dòng tiếp theo loại trừ một số hệ thống tệp (lưu ý rằng mô tả của bạn nói rằng bạn quan tâm abc:/xyz/pqr, nhưng mã của bạn loại trừ nó). Dòng awk cuối cùng loại bỏ %khỏi cột phần trăm trước khi in nó.

Sẽ tốt hơn nếu gửi một thư về tất cả các hệ thống tập tin. Lần này tôi đang làm tất cả các phân tích trong 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

Nếu bạn thay đổi print thành printf bằng% d, phần trăm sẽ trở thành số nguyên. Thử:

printf("%d", $5);

sẽ chuyển đổi 91% thành 91. Vì vậy, lệnh cuối cùng là:

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

Lệnh trên bằng tiếng Anh: "Lấy mức sử dụng không gian đĩa ở định dạng có thể đọc được của con người. Lọc xuống bằng grep vào đĩa mà chúng ta muốn xem. Đường ống đó để awk và in từ thứ 5 được phân cách bằng dấu cách (loại bỏ trống) và định dạng chuỗi kết quả là một số nguyên. Đối với tôi, lệnh trả về số nguyên 78có nghĩa là đĩa đã đầy 78%.


3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 mất tất cả đầu ra sau khi bỏ qua 2 dòng đầu tiên
  • sed s/%//g dải phần trăm dấu hiệu
  • awk ... in "Thông báo ..." nếu trường thứ 5 trong đầu ra là một số lớn hơn 90

1
Chào mừng bạn đến với Sàn giao dịch Stack! Chúng tôi đang tìm kiếm câu trả lời dài cung cấp một số giải thích và bối cảnh. Đừng chỉ đưa ra một câu trả lời một dòng; giải thích cách nó hoạt động. Câu trả lời không bao gồm giải thích có thể được gỡ bỏ.
G-Man nói 'Phục hồi Monica'

0

đây là biến thể của tôi:

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

Tôi không thể nhận xét về câu trả lời của Gilles ở trên, nhưng chỉ cần lưu ý rằng awk đang thực hiện so sánh dựa trên chuỗi trong phần thứ hai, trong đó:

$5 >= ALERT

Tôi nhận thấy điều này khi tôi đang kiểm tra ngưỡng một chữ số. Bạn có thể buộc cast thành int bằng cách sử dụng +0, do đó, phép so sánh trở thành:

$5+0 >= ALERT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.