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


11

我想在服务器上实现一个脚本,如果磁盘使用率超过90%,它将自动发送电子邮件警报;当磁盘使用率超过95%时,将自动发送第二电子邮件警报。我的文件系统是abc:/xyz/abc,挂载点是/pqr

我已经试过了:

ADMIN="someone@def.com" 
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 

Answers:


14

该错误是由于参数之一-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 

6

如果使用%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的数字,则显示“警告...”

1
欢迎使用Stack Exchange!我们正在寻找能提供一些解释和上下文的长答案。不要仅仅给出一个答案。解释它是如何工作的。不包含说明的答案可能会被删除。
G-Man说'恢复莫妮卡'

0

这是我的变体:

#!/bin/bash

ADMIN=yermail@yerdom.com
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom|Used' | awk '{ print $5 " " $1 }' | while read output; do 
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
echo $usep
partition=$(echo $output | awk '{ print $2 }' ) 
if [ $usep -ge $ALERT ]; then 
  echo  "Alert: Almost out of disk space $usep" 
  df -H | mail -s "Alert: out of disk space $usep"  $ADMIN
fi 
done

0

我无法对上面的Gilles答案发表评论,但是请注意,awk在第二部分中正在执行基于字符串的比较,其中:

$5 >= ALERT

我在测试个位数阈值时注意到了这一点。您可以使用+0强制将类型转换为int,因此比较变为:

$5+0 >= ALERT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.