一旦磁盘空间超过 90%,发送警报邮件的脚本就会发送磁盘已满,即使磁盘未满,如何解决此问题?

一旦磁盘空间超过 90%,发送警报邮件的脚本就会发送磁盘已满,即使磁盘未满,如何解决此问题?
#!/bin/bash

df -m > myfile
server_ip_address=$(ip addr show $(ip route | awk '/default/ { print $5 }') | grep "inet" | head -n 1 | awk '/inet/ {print $2}' | cut -d'/' -f1)

if awk '$2 > 10000 && $5 > 90' myfile ; then
    echo "Disk Full in $server_ip_address"
else
    echo "Nothing wrong with the server"
fi

当我执行脚本时,输出总是显示磁盘已满? df -m 的输出如下所示:

Filesystem              1M-blocks   Used Available Use% Mounted on
/dev/mapper/centos-root    949305 512827    436479  55% /
devtmpfs                     3811      0      3811   0% /dev
tmpfs                        3823      0      3823   0% /dev/abc
tmpfs                        3823     18      3806   1% /run
tmpfs                        3823      0      3823   0% /sys/fs/cgroup
/dev/sda2                    1014    175       840  18% /boot
/dev/sda1                    1022     12      1011   2% /boot/efi
tmpfs                         765      0       765   0% /run/user/2000

df -m 的输出因服务器而异。因此,我比较 Size>10GB 和 Use%>90%。由于某些大小 <10GB 的磁盘对于磁盘使用率低于 90% 可能并不重要。

更新1:

GNU bash,版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)

操作系统是centos 7

当前代码的问题:

我需要从第二行到最后一行的列进行比较,但我当前的代码正在比较第一行的列,这就是为什么我认为它不起作用。如何解决问题?

答案1

我当前代码中的问题是 df -H 的输出并不总是以 GB 为单位

这里的答案是不使用-H。正如其中记录的那样,man df它旨在作为“人类可读的输出”,并且单位可以有意改变。

请改用固定单位:默认 KB 或 MB ( -m)。

您可能还想了解 Nagios (Icinga)。这是一个监视工具,其中包含用于准确处理您正在处理的监视类型的脚本。

当我执行脚本时,始终将磁盘已满作为输出

这是因为if awk ...always返回true,因为awk总是成功结束,除非它在尝试执行其脚本时遇到错误(未找到文件、语法错误等),或者脚本以特定的非零状态退出


我倾向于考虑这样写脚本

#!/bin/sh
myIP=$(
    ip -j route |
    jq -r '.[] | select(.dst == "default") | .gateway'
)

df=$(
    df -lm -x tmpfs |
    awk '
        NR==1 { header=$0 }
        $5+0 > 90 { if (length(header)) { print header; header="" }; print }
    '
)

if [ -n "$df" ]
then
    echo "Problems with server $myIP"
    echo
    echo "$df"
else
    echo "Disk space seems ok on $myIP"
fi

相关内容