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

基于Check-MK的目录大小监控脚本需求:1.5小时未变更告警

思路合理性及实现方案

你的思路方向是对的,但单次获取目录大小没法判断是否1.5小时内未变化,必须结合历史记录对比。下面是具体的实现步骤和完整脚本:

核心逻辑说明

要实现需求,你需要:

  • 准确提取目录的字节级大小(用du -bs配合awk过滤)
  • 用缓存文件存储上次的目录大小和记录时间
  • 对比当前与历史的大小+时间差,判断是否触发告警

完整脚本示例

#!/bin/bash

# 监控目标目录
TARGET_DIR="/backup/log"
# 缓存文件,存储上次的大小和时间
CACHE_FILE="/var/tmp/backup_log_size.cache"
# 告警阈值(分钟)
THRESHOLD=90

# 1. 获取当前目录大小(字节)
current_size=$(du -bs "$TARGET_DIR" | awk '{print $1}')
if [ -z "$current_size" ]; then
    echo "UNKNOWN: 无法获取目录 $TARGET_DIR 的大小"
    exit 3
fi

current_time=$(date +%s)

# 2. 处理缓存文件
if [ ! -f "$CACHE_FILE" ]; then
    # 首次运行,写入缓存
    echo "$current_size $current_time" > "$CACHE_FILE"
    echo "OK: 初始化监控,当前目录大小为 $current_size 字节"
    exit 0
fi

# 读取历史数据
read -r last_size last_time < "$CACHE_FILE"

# 3. 计算时间差(分钟)
time_diff=$(( (current_time - last_time) / 60 ))

# 4. 判断告警条件
if [ "$current_size" -eq "$last_size" ]; then
    if [ "$time_diff" -ge "$THRESHOLD" ]; then
        echo "CRITICAL: 目录 $TARGET_DIR 大小已 $time_diff 分钟未变化(当前大小:$current_size 字节)"
        exit 2
    else
        echo "OK: 目录大小未变化,但仅过去 $time_diff 分钟(当前大小:$current_size 字节)"
        # 可选:若需重置计时,可取消下方注释更新缓存时间
        # echo "$current_size $current_time" > "$CACHE_FILE"
        exit 0
    fi
else
    # 大小有变化,更新缓存
    echo "$current_size $current_time" > "$CACHE_FILE"
    echo "OK: 目录大小更新为 $current_size 字节(较上次变化:$((current_size - last_size)) 字节)"
    exit 0
fi

Check-MK 接入注意事项

  • 将脚本保存为check_backup_log_size,放在Check-MK服务器的local/lib/nagios/plugins/目录(若监控远程主机则放到代理端对应目录)
  • 给脚本添加执行权限:chmod +x check_backup_log_size
  • 在Check-MK中添加自定义服务关联该脚本,系统会根据脚本退出码(0=正常, 2=告警)自动触发告警

补充说明

  • 缓存文件路径可根据实际环境调整,确保脚本有读写权限
  • 若需忽略目录内临时文件的微小变化,可考虑用find统计特定类型文件的大小,但你的需求是监控整个目录,du -bs已足够
  • 脚本中exit 3对应Check-MK的未知状态,用于处理目录无法访问等异常情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:15:38