企业微信/钉钉告警一键切换脚本(含静默周期+恢复通知)
本次提供整合版脚本,支持通过单个配置变量切换企微/钉钉告警,新增「静默周期防重复告警」和「磁盘使用率恢复通知」功能,进一步优化园区运维的告警体验,避免冗余通知、提升问题闭环效率。
一、整合版完整脚本(disk_monitor_alert.sh)
bash
#!/bin/bash
# 智慧园区磁盘监控告警脚本(企微/钉钉一键切换 + 静默周期 + 恢复通知)
# ===================== 核心配置区(按需修改)=====================
MONITOR_DIR="/data/park/record" # 监控目标目录
ALERT_THRESHOLD=85 # 告警阈值(%)
LOG_FILE="/data/park/logs/disk_monitor.log" # 监控日志路径
SILENT_PERIOD=3600 # 静默周期(秒),默认1小时(避免重复告警)
ALERT_CHANNEL="wechat" # 告警渠道:wechat=企业微信,dingtalk=钉钉
# 企业微信配置(ALERT_CHANNEL=wechat 时生效)
WECHAT_WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的企微机器人key"
# 钉钉配置(ALERT_CHANNEL=dingtalk 时生效,需包含安全关键词)
DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=你的钉钉机器人token"
DINGTALK_KEYWORD="告警" # 钉钉机器人安全关键词
# 恢复通知开关(1=启用,0=禁用)
ENABLE_RECOVER_ALERT=1
# =================================================================
# 步骤1:创建日志目录
mkdir -p $(dirname ${LOG_FILE})
# 步骤2:定义全局变量(用于静默周期和恢复判断)
ALERT_FLAG_FILE="/tmp/park_disk_alert.flag" # 告警标记文件(记录上次告警时间)
RECOVER_FLAG_FILE="/tmp/park_disk_recover.flag" # 恢复标记文件(避免重复发送恢复通知)
# 步骤3:获取磁盘信息(分区、使用率、总空间、剩余空间)
DISK_PART=$(df -P ${MONITOR_DIR} | tail -1 | awk '{print $1}')
DISK_USAGE=$(df -P ${MONITOR_DIR} | tail -1 | awk '{print $5}' | sed 's/%//g')
DISK_TOTAL=$(df -hP ${MONITOR_DIR} | tail -1 | awk '{print $2}')
DISK_FREE=$(df -hP ${MONITOR_DIR} | tail -1 | awk '{print $4}')
# 步骤4:记录基础监控日志
monitor_log="$(date +'%Y-%m-%d %H:%M:%S') - 磁盘分区:${DISK_PART} | 总空间:${DISK_TOTAL} | 剩余空间:${DISK_FREE} | 使用率:${DISK_USAGE}%"
echo ${monitor_log} >> ${LOG_FILE}
# 步骤5:定义企微告警发送函数
send_wechat_alert() {
local alert_type=$1 # alert=告警,recover=恢复
local payload
if [ "${alert_type}" = "alert" ]; then
# 企微告警消息体
payload=$(cat <<EOF
{
"msgtype": "markdown",
"markdown": {
"content": "### ⚠️ 智慧园区存储告警\n\n**告警时间**:$(date +'%Y-%m-%d %H:%M:%S')\n**磁盘分区**:${DISK_PART}\n**总空间**:${DISK_TOTAL}\n**剩余空间**:${DISK_FREE}\n**当前使用率**:${DISK_USAGE}%\n**告警阈值**:${ALERT_THRESHOLD}%\n**影响提示**:可能导致摄像头录制失败、AI预处理中断,请及时清理历史录像!"
}
}
EOF
)
else
# 企微恢复消息体
payload=$(cat <<EOF
{
"msgtype": "markdown",
"markdown": {
"content": "### ✅ 智慧园区存储恢复通知\n\n**恢复时间**:$(date +'%Y-%m-%d %H:%M:%S')\n**磁盘分区**:${DISK_PART}\n**总空间**:${DISK_TOTAL}\n**剩余空间**:${DISK_FREE}\n**当前使用率**:${DISK_USAGE}%\n**告警阈值**:${ALERT_THRESHOLD}%\n**状态提示**:磁盘使用率已降至阈值以下,存储业务恢复正常!"
}
}
EOF
)
fi
# 发送POST请求
curl -s -X POST -H "Content-Type: application/json" -d "${payload}" ${WECHAT_WEBHOOK} >> ${LOG_FILE} 2>&1
}
# 步骤6:定义钉钉告警发送函数
send_dingtalk_alert() {
local alert_type=$1 # alert=告警,recover=恢复
local payload
if [ "${alert_type}" = "alert" ]; then
# 钉钉告警消息体(包含安全关键词)
payload=$(cat <<EOF
{
"msgtype": "markdown",
"markdown": {
"title": "园区存储${DINGTALK_KEYWORD}",
"text": "### ⚠️ 智慧园区存储${DINGTALK_KEYWORD}\n\n**告警时间**:$(date +'%Y-%m-%d %H:%M:%S')\n**磁盘分区**:${DISK_PART}\n**总空间**:${DISK_TOTAL}\n**剩余空间**:${DISK_FREE}\n**当前使用率**:${DISK_USAGE}%\n**告警阈值**:${ALERT_THRESHOLD}%\n**影响提示**:可能导致摄像头录制失败、AI预处理中断,请及时清理历史录像!"
}
}
EOF
)
else
# 钉钉恢复消息体(包含安全关键词)
payload=$(cat <<EOF
{
"msgtype": "markdown",
"markdown": {
"title": "园区存储恢复",
"text": "### ✅ 智慧园区存储恢复通知(${DINGTALK_KEYWORD})\n\n**恢复时间**:$(date +'%Y-%m-%d %H:%M:%S')\n**磁盘分区**:${DISK_PART}\n**总空间**:${DISK_TOTAL}\n**剩余空间**:${DISK_FREE}\n**当前使用率**:${DISK_USAGE}%\n**告警阈值**:${ALERT_THRESHOLD}%\n**状态提示**:磁盘使用率已降至阈值以下,存储业务恢复正常!"
}
}
EOF
)
fi
# 发送POST请求
curl -s -X POST -H "Content-Type: application/json" -d "${payload}" ${DINGTALK_WEBHOOK} >> ${LOG_FILE} 2>&1
}
# 步骤7:定义统一告警调度函数(一键切换渠道)
dispatch_alert() {
local alert_type=$1 # alert=告警,recover=恢复
case ${ALERT_CHANNEL} in
"wechat")
send_wechat_alert "${alert_type}"
;;
"dingtalk")
send_dingtalk_alert "${alert_type}"
;;
*)
echo "$(date +'%Y-%m-%d %H:%M:%S') - 【错误】不支持的告警渠道:${ALERT_CHANNEL}" >> ${LOG_FILE}
return 1
;;
esac
# 记录告警发送日志
if [ "${alert_type}" = "alert" ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - ${ALERT_CHANNEL}告警已发送" >> ${LOG_FILE}
else
echo "$(date +'%Y-%m-%d %H:%M:%S') - ${ALERT_CHANNEL}恢复通知已发送" >> ${LOG_FILE}
fi
}
# 步骤8:静默周期判断函数(避免重复告警)
is_silent_period() {
if [ -f ${ALERT_FLAG_FILE} ]; then
local last_alert_time=$(cat ${ALERT_FLAG_FILE})
local current_time=$(date +'%s')
local time_diff=$((current_time - last_alert_time))
# 若未超过静默周期,返回1(静默中)
if [ ${time_diff} -lt ${SILENT_PERIOD} ]; then
return 1
fi
fi
# 超过静默周期/无上次告警,返回0(可告警)
return 0
}
# 步骤9:告警逻辑处理(超过阈值+静默周期判断)
if [ ${DISK_USAGE} -ge ${ALERT_THRESHOLD} ]; then
# 删除恢复标记(进入告警状态)
rm -f ${RECOVER_FLAG_FILE}
# 判断是否处于静默周期
if is_silent_period; then
# 构建告警日志并发送
echo "=====================================" >> ${LOG_FILE}
echo "$(date +'%Y-%m-%d %H:%M:%S') - 【告警】磁盘使用率${DISK_USAGE}%超过阈值${ALERT_THRESHOLD}%" >> ${LOG_FILE}
echo "=====================================" >> ${LOG_FILE}
# 发送告警
dispatch_alert "alert"
# 记录本次告警时间(更新标记文件)
date +'%s' > ${ALERT_FLAG_FILE}
else
# 静默周期内,仅记录日志不发送告警
echo "$(date +'%Y-%m-%d %H:%M:%S') - 【静默】磁盘使用率仍超标,处于静默周期内,暂不发送告警" >> ${LOG_FILE}
fi
else
# 步骤10:恢复通知逻辑(使用率降至阈值以下)
if [ ${ENABLE_RECOVER_ALERT} -eq 1 ] && [ ! -f ${RECOVER_FLAG_FILE} ] && [ -f ${ALERT_FLAG_FILE} ]; then
# 构建恢复日志并发送
echo "=====================================" >> ${LOG_FILE}
echo "$(date +'%Y-%m-%d %H:%M:%S') - 【恢复】磁盘使用率${DISK_USAGE}%已降至阈值${ALERT_THRESHOLD}%以下" >> ${LOG_FILE}
echo "=====================================" >> ${LOG_FILE}
# 发送恢复通知
dispatch_alert "recover"
# 创建恢复标记(避免重复发送)
touch ${RECOVER_FLAG_FILE}
# 删除告警标记(重置告警状态)
rm -f ${ALERT_FLAG_FILE}
fi
fi
exit 0
二、核心功能说明
1. 一键切换告警渠道
仅需修改 ALERT_CHANNEL 配置变量:
ALERT_CHANNEL="wechat":启用企业微信告警ALERT_CHANNEL="dingtalk":启用钉钉告警- 无需修改其他代码,实现快速切换,降低运维配置成本
2. 静默周期防重复告警
- 配置
SILENT_PERIOD=3600(默认1小时),超过阈值后1小时内仅发送1次告警 - 通过
/tmp/park_disk_alert.flag记录上次告警时间戳,避免网络抖动/磁盘波动导致的频繁通知 - 静默周期内仅记录日志,不触发群聊告警,减少运维干扰
3. 磁盘恢复通知
- 启用
ENABLE_RECOVER_ALERT=1,当磁盘使用率从超标状态降至阈值以下时,自动发送恢复通知 - 通过
/tmp/park_disk_recover.flag避免重复发送恢复通知,仅在「从告警→恢复」的首次切换时发送 - 恢复通知采用绿色标识,与告警消息区分,便于运维确认问题已解决
4. 兼容原有功能
- 保留完整的磁盘信息采集和日志记录
- 钉钉消息体内置安全关键词,符合钉钉机器人配置要求
- 企微消息体保持Markdown格式,排版清晰易读
三、使用步骤
1. 配置准备
- 替换脚本中的
WECHAT_WEBHOOK或DINGTALK_WEBHOOK为实际机器人Webhook - 钉钉用户确认
DINGTALK_KEYWORD与机器人配置的安全关键词一致 - 调整
ALERT_THRESHOLD(告警阈值)、SILENT_PERIOD(静默周期)为园区实际需求
2. 赋予执行权限
bash
chmod +x disk_monitor_alert.sh
3. 手动测试验证
(1)测试告警功能(临时修改阈值触发)
bash
# 临时将阈值改为1%,强制触发告警
sed -i 's/ALERT_THRESHOLD=85/ALERT_THRESHOLD=1/' disk_monitor_alert.sh
./disk_monitor_alert.sh
# 恢复原有阈值
sed -i 's/ALERT_THRESHOLD=1/ALERT_THRESHOLD=85/' disk_monitor_alert.sh
(2)查看测试结果
- 查看群聊是否收到告警消息
- 查看日志确认发送状态:
tail -f /data/park/logs/disk_monitor.log - 1小时内再次执行脚本,验证静默周期是否生效(仅记录日志,不发送告警)
4. 配置定时任务(保持每30分钟巡检)
bash
# 编辑定时任务
crontab -e
# 添加以下内容
*/30 * * * * /data/park/scripts/disk_monitor_alert.sh
四、优化与注意事项
- 依赖检查 :确保服务器安装
curl(sudo apt install curl/sudo yum install curl) - 标记文件清理 :
/tmp目录下的标记文件会在服务器重启后自动清理,不影响正常使用 - 告警降噪进阶:若需更精细的降噪,可新增「磁盘使用率连续3次超标才告警」的逻辑
- 日志轮转 :配合之前的
logrotate配置,定期清理监控日志,避免占用磁盘空间 - 网络连通性 :确保服务器能访问企微/钉钉API(可通过
curl -I ${WECHAT_WEBHOOK}测试连通性)
五、扩展功能(可选)
若需同时启用企微+钉钉双渠道告警,可修改 dispatch_alert 函数:
bash
dispatch_alert() {
local alert_type=$1
# 同时发送企微+钉钉告警
send_wechat_alert "${alert_type}"
send_dingtalk_alert "${alert_type}"
echo "$(date +'%Y-%m-%d %H:%M:%S') - 企微+钉钉双渠道告警已发送" >> ${LOG_FILE}
}