缓存失效处理需精准识别、限制范围、避免误删,核心是用find安全筛选后执行rm,配合flock防重入、日志记录和上线前验证。

缓存失效处理的核心不是“一删了之”,而是有依据、可控制、不误伤。定时任务配合 rm 清理过期缓存目录,关键在三点:精准识别过期目录、限制作用范围、避免误删系统路径。
明确缓存目录结构和过期判定逻辑
很多缓存服务(如 Nginx proxy_cache、自建 CDN 缓存、应用层临时产物)会按时间戳、哈希或日期命名子目录。例如:
-
/var/cache/myapp/20260901/(按日期命名) -
/var/cache/nginx/proxy/ab/cd/efgh...(哈希路径,需结合mtime判定)
不能只看目录名是否含“cache”就删——要确认该目录确实是应用生成的、可安全丢弃的缓存,且其内容已无进程占用(lsof +D /path 可查)。建议先用 find 加 -dry-run 模拟(如支持)或用 -ls 查看候选目标:
find /var/cache/myapp -maxdepth 1 -type d -name "202[0-9][0-9][0-9][0-9]" -mtime +7 -ls
用 find + rm 安全组合清理
直接 rm -rf 风险高,必须绑定 find 的精确筛选条件,并禁用通配符展开。推荐写成脚本,加防护逻辑:
- 限定目录层级(
-maxdepth 1),防止误入子级业务数据 - 强制检查目标是否为目录(
-type d),避免匹配到同名文件 - 用
-exec rm -rf {} +替代\;,提升效率且更安全 - 开头加
cd / &&或用绝对路径启动,避免相对路径错位
示例脚本 /usr/local/bin/clean-cache-dirs.sh:
#!/bin/bash
# 仅清理 /var/cache/myapp 下 7 天前的日期型子目录
find /var/cache/myapp -maxdepth 1 -type d -name "202[0-9][0-9][0-9][0-9]" -mtime +7 -exec rm -rf {} +
给执行权限:chmod +x /usr/local/bin/clean-cache-dirs.sh
配置定时任务并加入基础防护
用 crontab -e 添加任务,不直接写 rm 命令,而调用上述脚本,并增加日志和环境隔离:
# 每天凌晨 2:30 执行缓存目录清理 30 2 * * * /usr/bin/flock -n /tmp/clean-cache.lock -c '/usr/local/bin/clean-cache-dirs.sh >> /var/log/cache-clean.log 2>&1'
说明:
-
flock防止同一脚本重复运行(比如上次未结束就触发下一次) - 重定向日志便于追踪删了哪些目录、是否报错
- 使用绝对路径调用命令(
/usr/bin/flock,/usr/local/bin/...),避免 cron 环境变量缺失导致找不到命令 - 不加
sudo—— 脚本本身应由有权限的用户(如root或专用cacheuser)运行
上线前必做验证与兜底措施
切勿跳过测试环节:
- 手动执行脚本一次,观察输出和实际删除效果
- 检查
df -h和du -sh /var/cache/myapp/*确认空间释放符合预期 - 确认相关服务(如 Web 服务、API 后端)仍能正常生成新缓存、响应请求
- 在生产环境首次运行时,可先将
rm -rf替换为echo "would remove:",跑通逻辑再放开
长期建议:对重要缓存目录启用 chattr +a(仅追加)或挂载为 noexec,nosuid,nodev,从文件系统层降低误操作影响。











