我正在编写一个简单的 bash 脚本来检查系统上的磁盘使用情况。 while 循环应该只打印 85% 或以上的分区。 90% 以上有两个分区,但只有第一个分区被打印到输出。
代码:
#!/bin/bash
admin="[email protected]"
threshold="85"
df -h | tail -n +2 | awk '{print $1 " " $5}' | sed 's/.$//' | while read i; do
part=$(echo $i | awk '{print $1}')
util=$(echo $i | awk '{print $2}')
if [ $util -ge $threshold ]; then
echo $part is ${util}% full. An email has been sent to your administrator.
mail -s "Critical: $part is ${util}% full. Clear space immeadiately!" $admin
fi
done
输出:
/dev/mapper/rootvg-root is 92% full. An email has been sent to your administrator.
但是,您可以看到 /dev/mapper/rootvg-apps 也已满 98%:
/dev/mapper/rootvg-apps 20G 20G 445M 98% /apps
/dev/mapper/rootvg-tmp 6.0G 2.4G 3.7G 39% /tmp
/dev/mapper/rootvg-var_log 6.0G 71M 6.0G 2% /var/log
/dev/xvda1 497M 142M 356M 29% /boot
答案1
我认为你的df -h
输出有问题。
尝试用df -Ph
更新:
根据手册页,-P
引用 POSIX 输出格式
-P, --portability
use the POSIX output format
而且,如果您的分区具有更长的长度,并且在使用命令(不带-P
)进行文本处理时,您的预期行输出将分为两行。
期望(示例):
/dev/mapper/rootvg-tmp/tmp1 86
/dev/mapper/rootvg-tmp/tmp2 90
/tmp 90
实际输出(示例):
/dev/mapper/rootvg-tmp/tmp1
86
/dev/mapper/rootvg-tmp/tmp2
90
/tmp 90
因此,在这种情况下,脚本中的条件将与前两个分区不匹配,因为'{print $2}'
将不匹配且$util -ge $threshold
为 false。
华泰