【FFmpeg 智慧园区场景应用】5.企业微信 / 钉钉告警一键切换脚本(含静默周期 + 恢复通知)

企业微信/钉钉告警一键切换脚本(含静默周期+恢复通知)

本次提供整合版脚本,支持通过单个配置变量切换企微/钉钉告警,新增「静默周期防重复告警」和「磁盘使用率恢复通知」功能,进一步优化园区运维的告警体验,避免冗余通知、提升问题闭环效率。

一、整合版完整脚本(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. 配置准备

  1. 替换脚本中的 WECHAT_WEBHOOKDINGTALK_WEBHOOK 为实际机器人Webhook
  2. 钉钉用户确认 DINGTALK_KEYWORD 与机器人配置的安全关键词一致
  3. 调整 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)查看测试结果
  1. 查看群聊是否收到告警消息
  2. 查看日志确认发送状态:tail -f /data/park/logs/disk_monitor.log
  3. 1小时内再次执行脚本,验证静默周期是否生效(仅记录日志,不发送告警)

4. 配置定时任务(保持每30分钟巡检)

bash 复制代码
# 编辑定时任务
crontab -e
# 添加以下内容
*/30 * * * * /data/park/scripts/disk_monitor_alert.sh

四、优化与注意事项

  1. 依赖检查 :确保服务器安装 curlsudo apt install curl/sudo yum install curl
  2. 标记文件清理/tmp 目录下的标记文件会在服务器重启后自动清理,不影响正常使用
  3. 告警降噪进阶:若需更精细的降噪,可新增「磁盘使用率连续3次超标才告警」的逻辑
  4. 日志轮转 :配合之前的 logrotate 配置,定期清理监控日志,避免占用磁盘空间
  5. 网络连通性 :确保服务器能访问企微/钉钉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}
}
相关推荐
来鸟 鸣间7 小时前
音视频之ffmpeg基本信息查询命令
ffmpeg·音视频
kkoral8 小时前
【FFmpeg 智慧园区场景应用】4.企业微信 / 钉钉机器人告警配置(替换邮件告警)
ffmpeg·钉钉·企业微信
智子喻9 小时前
2026企业微信社群运营工具专业度排名:AI驱动下的私域增长工具实测
大数据·网络·新媒体运营·企业微信·用户运营
2501_941982059 小时前
企微API外部群自动化:快速建立自己的护城河
运维·自动化·企业微信
kkoral10 小时前
【FFmpeg 智慧园区场景应用】3.Shell脚本增强:故障自动重启 + 磁盘监控告警
ffmpeg
大大祥1 天前
Android FFmpeg集成
android·ffmpeg·kotlin·音视频·jni·ndk·音视频编解码
好多渔鱼好多1 天前
【流媒体】FFmpeg技术介绍与构建方法
ffmpeg
没有羊的王K1 天前
下载安装FFmpeg教程
ffmpeg
天空属于哈夫克31 天前
驱动级企微群控:超越模拟点击的外部群操作技术自动化
运维·自动化·企业微信