磁盘使用率超过 90% 时发送警报邮件的 Shell 脚本

11 disk-usage shell-script text-processing

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

但我收到一个错误,上面写着

line 7: [: Use: integer expression expected 
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 13

错误是由于参数之一-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
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)


小智 6

如果使用 %d 将 print 更改为 printf,则百分比将变为整数。尝试:

printf("%d", $5);
Run Code Online (Sandbox Code Playgroud)

这会将 91% 转换为 91。所以最终命令是这样的:

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'
Run Code Online (Sandbox Code Playgroud)

上面的英文命令: “以人类可读的格式获取磁盘空间使用情况。使用 grep 过滤到我们想要查看的磁盘。将该行管道输送到 awk 并打印由空格分隔的第 5 个单词(删除空字符),然后格式化结果字符串为整数。对我来说,命令返回整数78,这意味着磁盘已满 78%。