如果磁盘空间超出则发送电子邮件

如果磁盘空间超出则发送电子邮件

我有一个脚本,用于计算可用磁盘空间,如果限制超过我定义的给定值,则通过电子邮件发出警报。脚本如下:

df -H | grep -vE '^Filesystem|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
    MessageSpace="Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)"
    spacealert
    fi
done

现在,问题是,如果我有两个磁盘的限制超出了给定的限制,那么它将生成两封单独的邮件。我可以只给我发送一封电子邮件吗?谢谢。

答案1

一种方法是创建一个临时文件并将任何过度使用警报写入该文件。如果我们检查完所有分区后,该文件不为空,则会发送一封电子邮件:

tmpfile="$HOME/.fs_usage_check.tmp"
echo -n "" >"$tmpfile"
df -H | grep -vE '^Filesystem|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
        echo "Running out of space \"$partition  ($usep%)\" on $(hostname) as on $(date)" >>"$tmpfile"
    fi
done
if [ -s "$tmpfile" ] ; then
    mail  -s "Disk Space Warning" someone@host <"$tmpfile"
fi
rm -f "$tmpfile"

我不熟悉spacealert您使用的实用程序,因此我用它mail来代替发送电子邮件。

顺便说一句,我认为 awk/while/read 语句可以稍微简化一下:

tmpfile="$HOME/fs_usage_check.tmp"
echo -n "" >"$tmpfile"
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $1,$5 }' | while read partition usep ; do
    if [ ${usep%%%} -ge $Alert ]; then
        echo "Running out of space \"$partition  ($usep)\" on $(hostname) as on $(date)" >>"$tmpfile"
    fi
done
if [ -s "$tmpfile" ] ; then
    mail  -s "Disk Space Warning" someone@host <"$tmpfile"
fi
rm -f "$tmpfile"

在这个简化形式中,usep变量略有变化:它仍然带有“%”符号。我们需要删除百分号才能进行数字比较。Bash 有一个特殊的参数扩展,用于删除此类后缀,看起来像${var%pattern}或,要删除最长的模式匹配后缀,${var%%pattern}。在我们的例子中,因为模式本身是一个百分号,与 bash 的魔法字符相同,我们需要对其进行转义(如${usep%\%})或使用最长的匹配命令(如${usep%%%})。

请注意,do while循环位于管道中,因此位于子 shell 中(我假设您使用的是 bash 或 dash 或类似的 shell)。因此,其环境变量在循环之外均不存在。当然,临时文件仍然存在,这使得它非常适合发出是否应发送消息的信号。

相关内容