如果磁盘使用率超过 90%,则发送警报邮件的 Shell 脚本

如果磁盘使用率超过 90%,则发送警报邮件的 Shell 脚本

我想在我的服务器上实现一个脚本,如果磁盘使用率超过 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

相关内容