用cron+shell可稳定实现冷缓存定时清理,关键在于基于atime/mtime精准识别冷缓存、通过预统计和-delete安全删除、配合日志审计与防并发机制,并需定期对齐业务保留策略。

直接用 cron + shell 组合就能稳定实现冷缓存定时清理,关键在于精准识别“冷缓存”、安全删除、避免误删,同时让脚本可维护、可追溯。
明确“冷缓存”的定义和判断依据
冷缓存通常指长期未被访问、不再需要的缓存文件。不能只看文件名或后缀,而应依赖访问时间(atime)或修改时间(mtime)。生产环境推荐用 atime(最后访问时间),更真实反映“是否还在用”:
- 若系统挂载时加了
noatime或relatime,atime可能不更新 → 改用mtime(需确认业务缓存写入后不改mtime) - 建议先手动验证:
find /path/to/cache -type f -atime +30 -ls | head -5,确认结果符合预期 - 避免匹配到目录、符号链接或临时文件(如
*~、.tmp),加-type f和排除逻辑
编写安全、可读的清理脚本
以下是一个带日志、预检查、防误删的典型脚本(保存为 /opt/scripts/clean_cache.sh):
#!/bin/bash # 清理指定目录下 30 天未访问的普通文件 CACHE_DIR="/var/tmp/myapp_cache" DAYS=30 LOG_FILE="/var/log/cache_clean.log" DATE=$(date '+%Y-%m-%d %H:%M:%S') <h1>检查目录是否存在且可读</h1><p>if [[ ! -d "$CACHE_DIR" ]] || [[ ! -r "$CACHE_DIR" ]]; then echo "[$DATE] ERROR: Cache dir not accessible: $CACHE_DIR" >> "$LOG_FILE" exit 1 fi</p><p>echo "[$DATE] START cleaning cold cache in $CACHE_DIR (atime > $DAYS days)" >> "$LOG_FILE"</p><h1>预统计(不删除),记录数量和大小</h1><p>COUNT=$(find "$CACHE_DIR" -type f -atime +"$DAYS" | wc -l) SIZE=$(find "$CACHE_DIR" -type f -atime +"$DAYS" -print0 | du -ch --files0-from=- 2>/dev/null | tail -1 | cut -f1)</p><p>echo "[$DATE] Found $COUNT files, total size ~$SIZE" >> "$LOG_FILE"</p><h1>真正删除(加 -delete;如需调试,先换成 -print)</h1><p>if [[ $COUNT -gt 0 ]]; then find "$CACHE_DIR" -type f -atime +"$DAYS" -delete >> "$LOG_FILE" 2>&1 echo "[$DATE] DONE. $COUNT files removed." >> "$LOG_FILE" else echo "[$DATE] Nothing to clean." >> "$LOG_FILE" fi
- 必须加
#!/bin/bash并用bash执行(避免 sh 兼容问题) - 所有路径用变量定义,便于复用和修改
- 删除前先统计,既防空操作,也留审计痕迹
- 用
-delete而非-exec rm {} \;,效率更高、更原子
配置 cron 定时任务
用系统级 crontab(如 root)保证权限,并避免用户环境变量干扰:
# 编辑 root 的 crontab:crontab -e # 每天凌晨 2:15 执行(避开业务高峰) 15 2 * * * /bin/bash /opt/scripts/clean_cache.sh >/dev/null 2>&1
- 显式调用
/bin/bash,不依赖 PATH - 重定向
/dev/null避免邮件轰炸;所有输出已进日志 - 首次部署后,手动运行一次:
sudo /opt/scripts/clean_cache.sh,检查日志和效果 - 可加简单监控:比如每天检查日志中 “Nothing to clean” 是否连续多日出现,提示策略可能过严
增强健壮性的实用建议
面向生产环境,还需考虑这些细节:
-
保留最小空间:若缓存目录在独立分区,可用
df检查使用率,低于阈值才清理(例如:仅当$(df /var/tmp | awk 'NR==2 {print $5}' | sed 's/%//') -gt 85时执行) -
排除重要子目录:如
find ... -path "./temp" -prune -o -type f -atime +30 -print0 -
加锁防重复:脚本开头用
flock -n /tmp/clean_cache.lock -c "...",避免 cron 间隔短导致并发执行 -
日志轮转:用 logrotate 管理
/var/log/cache_clean.log,防止撑满磁盘
不复杂但容易忽略:冷缓存的“冷”是业务定义的,定期和开发/运维对齐保留策略,比脚本本身更重要。

















