请求编写Asterisk旧目录清理Shell脚本(磁盘阈值触发)
我来帮你完善这个清理Asterisk录音文件的Shell脚本,解决磁盘空间阈值触发清理的问题,同时修复原脚本里的跨年边界漏洞:
完整的Asterisk录音自动清理脚本
#!/bin/bash # -------------------------- 配置参数区 -------------------------- DISK_THRESHOLD="75" # 磁盘使用率触发清理的阈值(百分比) MONITOR_DIR="/var/spool/asterisk/monitor" # Asterisk录音根目录 MONTHS_TO_KEEP="2" # 保留最近N个月的录音,超过的自动删除 TARGET_DISK="/dev/xvdb1" # 目标磁盘设备(用df -h可查看你的实际设备) # --------------------------------------------------------------- # 获取目标磁盘的使用率(去掉%符号,避免格式问题) USAGE=$(df -P "$TARGET_DISK" | awk 'NR==2 {gsub("%","",$5); print $5}') # 判断是否达到清理条件 if [ "$USAGE" -ge "$DISK_THRESHOLD" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - 磁盘使用率达到${USAGE}%,触发清理流程" # 计算需要保留的起始年月(自动处理跨年,比如1月减2个月会得到去年11月) RETAIN_SINCE=$(date -d "-${MONTHS_TO_KEEP} months" +"%Y/%m") # 遍历所有YYYY/MM格式的录音目录,删除早于保留起始时间的目录 find "$MONITOR_DIR" -type d -regextype posix-extended -regex '.*/[0-9]{4}/[0-9]{2}' | while read -r old_dir; do # 提取目录的年月部分(如2024/03) dir_ym=$(basename "$(dirname "$old_dir")")/$(basename "$old_dir") if [[ "$dir_ym" < "$RETAIN_SINCE" ]]; then echo "正在删除旧录音目录: $old_dir" rm -rf "$old_dir" fi done echo "$(date '+%Y-%m-%d %H:%M:%S') - 清理完成" else echo "$(date '+%Y-%m-%d %H:%M:%S') - 磁盘使用率${USAGE}%,未达到阈值${DISK_THRESHOLD}%,无需清理" fi
脚本优化亮点
- 去掉冗余临时文件:原脚本用
temp.log存磁盘使用率完全没必要,直接通过管道把结果赋值给变量,更高效 - 完美处理跨年场景:用
date -d "-N months"自动计算N个月前的日期,避免了原脚本中1月减2得到负数的bug - 精准匹配目录:用正则表达式锁定
YYYY/MM格式的录音目录,防止误删其他无关文件 - 可视化日志:添加时间戳日志,方便后续排查清理记录
- 参数集中配置:所有可调整的参数都放在开头,不用深入代码就能修改阈值、保留时长等
使用说明
- 替换脚本中的
TARGET_DISK为你的实际挂载磁盘设备(执行df -h可查看) - 根据业务需求调整
DISK_THRESHOLD和MONTHS_TO_KEEP参数 - 给脚本添加执行权限:
chmod +x asterisk_cleanup.sh - 可以添加到crontab定时执行,比如每天凌晨2点自动检查清理:
0 2 * * * /path/to/asterisk_cleanup.sh >> /var/log/asterisk_cleanup.log 2>&1
内容的提问来源于stack exchange,提问作者Dani A.
相关产品推荐
相关产品推荐

