Shell脚本自动清理网站缓存,定时释放资源
网站运行久了,缓存文件会越积越多,不仅占用磁盘空间,还可能拖慢响应速度。
手动清理费时费力,用Shell脚本自动清理网站缓存并配合定时任务释放资源,是运维中很实用的一招。
下面从零开始,带你写出能直接跑的脚本并设置好定时执行。
先搞清楚要清理哪些缓存
不同环境缓存位置不一样,动手前先确认你的网站缓存类型。
常见的有:
- Nginx缓存:通常在
/var/cache/nginx或配置文件中proxy_cache_path指定的目录。 - PHP缓存:如OPcache(内存中,重启PHP-FPM生效)、ThinkPHP的
runtime/cache、Laravel的storage/framework/cache。 - 宝塔面板缓存:网站根目录下的
runtime文件夹,或面板自带的缓存清理功能。 - CDN缓存:一般通过API刷新,不在本文脚本范围。
判断依据:登录服务器,用 du -sh /path/to/cache 查看缓存目录大小,确认路径后再写脚本。
编写清理脚本
创建一个脚本文件,比如 /root/clean_cache.sh,内容如下:
#!/bin/bash
# 清理网站缓存脚本
# 定义缓存目录,按实际路径修改
CACHE_DIRS=(
"/www/wwwroot/your_site/runtime/cache"
"/var/cache/nginx"
)
# 日志文件
LOG_FILE="/var/log/clean_cache.log"
# 记录开始时间
echo "$(date '+%Y-%m-%d %H:%M:%S') 开始清理缓存" >> "$LOG_FILE"
for DIR in "${CACHE_DIRS[@]}"; do
if [ -d "$DIR" ]; then
# 删除目录下所有内容,保留目录本身
rm -rf "$DIR"/*
echo "已清理: $DIR" >> "$LOG_FILE"
else
echo "目录不存在,跳过: $DIR" >> "$LOG_FILE"
fi
done
# 可选:重启PHP-FPM释放内存缓存(根据实际服务名调整)
# systemctl restart php-fpm
echo "$(date '+%Y-%m-%d %H:%M:%S') 清理完成" >> "$LOG_FILE"
关键点:
CACHE_DIRS数组里填入你实际要清理的目录,多个目录用空格隔开。- 使用
rm -rf "$DIR"/*只删除目录内文件,不删除目录本身,避免权限问题。 - 日志记录方便排查,建议保留。
保存后赋予执行权限:
chmod +x /root/clean_cache.sh
先手动运行一次,检查是否有报错:
/root/clean_cache.sh
然后查看日志确认:
cat /var/log/clean_cache.log
设置定时任务自动执行
用 crontab 让脚本每天凌晨3点跑一次:
crontab -e
在末尾添加一行:
0 3 * * * /bin/bash /root/clean_cache.sh
保存退出。注意:如果脚本中用到 systemctl 等命令,建议写绝对路径,比如 /bin/systemctl,因为crontab环境变量可能不全。
查看当前定时任务:
crontab -l
避坑指南
- 权限问题:脚本要以root或对缓存目录有写权限的用户运行,否则
rm会失败。可以在脚本开头加[ "$(id -u)" -eq 0 ] || { echo "需要root权限"; exit 1; }做检查。 - 误删风险:
rm -rf很危险,务必确认CACHE_DIRS路径正确,不要写成/或网站根目录。可以先echo出要删除的路径测试。 - 缓存目录不存在:脚本已做判断,但如果你用了变量拼接,注意路径末尾不要多写斜杠。
- 服务重启:如果清理OPcache需要重启PHP-FPM,建议放在低峰期,并确保服务名正确(如
php-fpm或php7.4-fpm)。 - 日志轮转:长期运行日志会变大,可用
logrotate或定期清空日志文件。
验证清理效果
执行脚本后,用以下命令检查:
du -sh /www/wwwroot/your_site/runtime/cache
对比清理前后的大小,如果明显变小,说明生效。
同时观察网站访问是否正常,缓存重建是正常现象。
可独立摘录的结论:
- Shell脚本清理缓存的核心是准确定位缓存目录,并用
rm -rf删除内容而非目录本身。 - crontab定时任务需使用绝对路径,避免环境变量缺失导致执行失败。
- 清理前务必确认路径,防止误删;建议先手动运行测试。
- 清理后通过
du -sh对比目录大小,可快速验证效果。
常见疑问
脚本执行了但缓存没减少?
检查 CACHE_DIRS 是否写对,以及运行用户是否有权限。查看日志中是否提示“目录不存在”。
定时任务没反应?
确认cron服务是否运行:systemctl status crond。另外检查脚本中命令是否用了绝对路径,crontab的PATH变量很有限。
需要清理内存缓存怎么办?
内存缓存如Redis、Memcached需通过各自命令清理,例如 redis-cli flushall,但会清空所有数据,谨慎使用。
清理频率多高合适?
根据网站更新频率和缓存策略,一般每天一次或每周一次即可。频繁清理可能增加服务器负载。
按照以上步骤,你就能用Shell脚本自动清理网站缓存并定时释放资源,减少手动维护成本。
如果环境特殊,调整目录和服务名后同样适用。