我有一个脚本来计算可用磁盘空间,如果限制超出了我定义的给定值,则会通过电子邮件发出警报。这是脚本:
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
现在,问题是如果我有两个磁盘的限制已经超过了给定的限制,那么它将生成两个单独的邮件。我可以发送一封电子邮件给我吗?谢谢。
一种方法是创建一个临时文件,并将所有过度使用的警报写入该文件。在浏览所有分区后,如果文件不为空,则会发送一封电子邮件:
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
循环位于管道中,因此位于子外壳程序中(我假设您正在使用bash或破折号或类似的外壳程序)。因此,它的任何环境变量都无法幸免于难。临时文件当然可以保留下来,这对于发信号通知是否应该发送消息很有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句