Lỗi là do một trong các đối số -ge
không phải là số. Vì $ALERT
luôn luôn là số, $usep
phải là thủ phạm. Có một số vấn đề với cách bạn phân tích đầu ra dh
dẫn đến kết quả $usep
không phải là số.
Tùy thuộc vào độ dài của các hệ thống tập tin, dh
có 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 -P
tùy chọn.
Cũng df
in 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==1
phù 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