如何修改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
相关产品推荐
相关产品推荐

