我想在我的服务器上实现一个脚本,如果磁盘使用率超过 90%,它将自动发送电子邮件警报,并在磁盘使用率超过 95% 时自动发送第二封电子邮件警报。我的文件系统是abc:/xyz/abc
,挂载点是/pqr
。
我已经尝试过这个:
ADMIN="[email protected]"
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | 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
mail -s "Alert: Almost out of disk space $usep" $ADMIN
fi
done
但我收到一个错误,上面写着
line 7: [: Use: integer expression expected
答案1
该错误是由于参数之一-ge
不是数字造成的。由于$ALERT
始终是数字,因此$usep
必须是罪魁祸首。解析输出的方式存在几个问题,dh
导致$usep
输出不是数字。
根据文件系统的长度,dh
可能会将其输出分成几行。部分行将被过滤器捕获并产生无意义的数据。要避免此行为并从 获取可解析的输出dh
,请传递该-P
选项。
还df
打印标题行,这又会导致无意义的数据。
你的过滤器相当复杂。我会使用一次 awk。就此而言,您可以对 awk 内的百分比进行过滤(但我没有在下面的脚本中这样做)。
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
匹配第一行,因此NR==1 {next}
跳过第一行。接下来的几行排除了一些文件系统(请注意,您的描述表明您对 感兴趣abc:/xyz/pqr
,但您的代码排除了它)。最后 awk 行在%
打印之前从百分比列中删除 。
最好发送一封有关所有文件系统的邮件。这次我在 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
答案2
如果使用 %d 将 print 更改为 printf,则百分比将变为整数。尝试:
printf("%d", $5);
这会将 91% 转换为 91。所以最终命令是这样的:
df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'
上述命令的英文为: “以人类可读的格式获取磁盘空间使用情况。使用 grep 过滤到我们想要查看的磁盘。将该行通过管道传输到 awk 并打印由空格分隔的第 5 个单词(删除空值),并将结果字符串格式化为整数对我来说,该命令返回整数78
,这意味着磁盘已满 78%。
答案3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
df | tail +2
跳过前两行后获取所有输出sed s/%//g
去掉百分号awk ...
如果输出中的第 5 个字段是大于 90 的数字,则打印“Alert ...”
答案4
我无法对上面的 Gilles 答案发表评论,但请注意 awk 在第二部分中进行基于字符串的比较,其中:
$5 >= ALERT
我在测试个位数阈值时注意到了这一点。您可以使用 +0 强制转换为 int,因此比较变为:
$5+0 >= ALERT