基于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
相关产品推荐
相关产品推荐

