You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改shell磁盘监控脚本实现同阈值下不重复发送告警邮件

磁盘使用率监控脚本修改方案

前置修复:原脚本已知问题处理

原脚本存在两个会导致功能失效的bug,需要先修复:

  • 存在重复的MAX=""空赋值行,会把前面设置的85%阈值覆盖,直接删除该行即可
  • 原使用率获取逻辑错误:df -h | grep ${DISK} | awk {'print $4'}拿到的是分区剩余可用容量,不是使用率,需要更换为标准化输出命令避免兼容性问题

需求实现逻辑

针对你要求的「仅使用率超过85%时发告警,等于85%不重复发信」的需求,实现思路如下:

  • 将原有阈值判断规则从「大于等于85%触发」改为「仅大于85%触发」
  • 新增临时状态文件记录上一次发告警时的使用率,仅当本次使用率高于上一次告警值/首次超过阈值时才发信,避免重复推送相同告警
  • 使用率回落到85%及以下时清空状态记录,方便后续再次超过阈值时正常触发告警

修改后完整脚本

#!/bin/bash

DISK="/home" # 待监控分区
MAX="85%" # 告警阈值,仅超过该值时触发通知
DOMAIN="your.com"
STATE_FILE="/tmp/disk_home_last_alert" # 告警状态记录文件

# 修正:获取分区实际使用率,使用-P参数标准化输出避免不同系统列错位
CURRENT=$(df -P ${DISK} | awk 'NR==2{print $5}') 

# functions #
function max_exceeded() {
    # 查找分区下占用最大的目录
    cd $DISK
    for i in `ls` ; do du -s $i ; done > /tmp/mail.1
    sort -gk 1 /tmp/mail.1 | tail -1 | awk -F " " '{print $2}' > /tmp/mail.offender
    OFFENDER=`cat /tmp/mail.offender`
    du -sh $DISK/$OFFENDER > /tmp/mail.over85
    # 发送告警邮件
    mail -s "$HOSTNAME $DISK Alert!" "$OFFENDER@$DOMAIN, admin@$DOMAIN"  < /tmp/mail.over85
    # 更新状态文件,记录本次告警的使用率
    echo ${CURRENT%?} > $STATE_FILE
    echo "Max usage (${MAX}) exceeded. The /home disk usage is at ${CURRENT}. Sending email."
}

function main() {
    if [ -z "${CURRENT}" ]; then
        return
    fi
    CURRENT_NUM=${CURRENT%?}
    MAX_NUM=${MAX%?}

    # 仅当使用率超过阈值时才进入告警逻辑
    if [ ${CURRENT_NUM} -gt ${MAX_NUM} ]; then
        # 读取上一次告警的使用率
        LAST_ALERT=0
        if [ -f $STATE_FILE ]; then
            LAST_ALERT=$(cat $STATE_FILE)
        fi
        # 仅当本次使用率高于上一次告警值时才发信,避免重复告警
        if [ ${CURRENT_NUM} -gt ${LAST_ALERT} ]; then
            max_exceeded
        fi
    else
        # 使用率等于或低于阈值时清空状态记录
        if [ -f $STATE_FILE ]; then
            rm $STATE_FILE
        fi
    fi
}

# 执行主逻辑
main

# 清理临时文件
rm /tmp/mail.1
rm /tmp/mail.offender
rm /tmp/mail.over85  # 原脚本注释了删除,这里按需开启即可

核心修改说明

  • 修正了使用率获取逻辑,兼容不同Linux发行版的df输出格式
  • 阈值判断从-ge(大于等于)改为-gt(大于),等于85%时不会触发告警
  • 新增状态文件记录上一次告警值,只有使用率超过上一次告警值时才发新的告警,避免脚本周期性运行重复发信
  • 使用率回落到阈值及以下时自动清空状态,后续再次超过阈值时可以正常触发告警

内容的提问来源于stack exchange,提问作者pirulo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:09:05