服务器运维脚本

织梦缓存目录定期清理脚本

织梦运行过程中会在 /data/cache//data/sessions//uploads/allimg/ 等目录持续产生缓存和临时文件。长期不清理会导致磁盘占用暴涨、站点变慢、甚至 inode 耗尽。手动清理容易遗漏,最佳方案是写脚本配合定时任务自动执行。本文给出完整的 Shell 脚本和部署方法。

一、织梦需要清理的目录

1. 标签缓存

/data/cache/ —— arclist 等标签的缓存文件,扩展名 .cache.inc。可安全删除,系统会自动重建。

2. Session 文件

/data/sessions/ —— 会员登录、后台登录的 session 文件。过期的 session 可清理,但正在用的不能删。

3. 编辑器临时文件

/uploads/allimg/ 下可能有上传后未引用的孤儿图片,/uploads/userup/ 是会员上传临时目录。

4. 后台操作日志

/data/log/ —— 操作日志,可定期归档或清理。

5. 编译模板缓存

/data/tplcache/ —— 模板编译缓存,改模板后需清理。

二、清理脚本设计原则

  • 只删过期文件 —— session 只删超过 24 小时的,缓存全删(可重建)
  • 保留目录结构 —— 只删文件不删目录,避免织梦找不到目录报错
  • 记录日志 —— 每次清理写日志,方便排查
  • 安全防护 —— 路径变量化,避免误删系统文件
  • 可回滚 —— 重要数据先打包再清理

三、完整 Shell 脚本

#!/bin/bash
# dedecms_cache_clean.sh
# 织梦缓存定期清理脚本

#=====配置区=====DEDE_ROOT="/www/web/dedecms"        # 织梦根目录
LOG_FILE="/var/log/dedecms_clean.log" # 日志文件
SESSION_EXPIRE=86400                # session过期时间(秒),默认24小时
KEEP_DAYS=30                        # 日志保留天数

#=====函数区=====log(){
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

#=====检查目录存在=====if [ ! -d "$DEDE_ROOT/data" ]; then
    log "错误:织梦目录不存在 $DEDE_ROOT"
    exit 1
fi

log "=====开始清理织梦缓存====="

# 1. 清理标签缓存(全删,可重建)
CACHE_DIR="$DEDE_ROOT/data/cache"
if [ -d "$CACHE_DIR" ]; then
    COUNT=$(find $CACHE_DIR -type f | wc -l)
    find $CACHE_DIR -type f -delete
    log "清理标签缓存:删除 $COUNT 个文件"
fi

# 2. 清理过期 session(只删超过24小时的)
SESSION_DIR="$DEDE_ROOT/data/sessions"
if [ -d "$SESSION_DIR" ]; then
    COUNT=$(find $SESSION_DIR -type f -mtime +1 | wc -l)
    find $SESSION_DIR -type f -mtime +1 -delete
    log "清理过期 session:删除 $COUNT 个文件"
fi

# 3. 清理模板编译缓存(全删)
TPLCACHE_DIR="$DEDE_ROOT/data/tplcache"
if [ -d "$TPLCACHE_DIR" ]; then
    COUNT=$(find $TPLCACHE_DIR -type f | wc -l)
    find $TPLCACHE_DIR -type f -delete
    log "清理模板缓存:删除 $COUNT 个文件"
fi

# 4. 归档并清理操作日志(保留最近30天)
LOG_DIR="$DEDE_ROOT/data/log"
if [ -d "$LOG_DIR" ]; then
    COUNT=$(find $LOG_DIR -type f -mtime +$KEEP_DAYS | wc -l)
    find $LOG_DIR -type f -mtime +$KEEP_DAYS -delete
    log "清理过期日志:删除 $COUNT 个文件"
fi

# 5. 清理uploads临时目录(超过7天的)
USERUP_DIR="$DEDE_ROOT/uploads/userup"
if [ -d "$USERUP_DIR" ]; then
    COUNT=$(find $USERUP_DIR -type f -mtime +7 | wc -l)
    find $USERUP_DIR -type f -mtime +7 -delete
    log "清理会员上传临时文件:删除 $COUNT 个文件"
fi

# 6. 清理首页静态缓存
INDEX_CACHE="$DEDE_ROOT/data/cache/index_*.html"
COUNT=$(ls -1 $INDEX_CACHE 2>/dev/null | wc -l)
rm -f $INDEX_CACHE
log "清理首页缓存:删除 $COUNT 个文件"

log "=====清理完成====="
log ""

四、脚本部署步骤

1. 上传脚本

# 保存为
vim /usr/local/bin/dedecms_cache_clean.sh

# 赋予执行权限
chmod +x /usr/local/bin/dedecms_cache_clean.sh

2. 修改配置

编辑脚本,把 DEDE_ROOT 改成实际织梦路径。如果用宝塔面板,路径通常是 /www/wwwroot/域名

3. 手动测试

# 先干跑一次看日志
/usr/local/bin/dedecms_cache_clean.sh

# 查看日志
cat /var/log/dedecms_clean.log

确认清理数量合理,没有误删。

4. 配置定时任务

# 编辑 crontab
crontab -e

# 每天凌晨3点执行
0 3 * * * /usr/local/bin/dedecms_cache_clean.sh >/dev/null 2>&1

# 或每6小时执行一次(高流量站点)
0 */6 * * * /usr/local/bin/dedecms_cache_clean.sh >/dev/null 2>&1

五、宝塔面板配置方式

宝塔用户可以用“计划任务”功能,不用写 crontab:

  1. 登录宝塔面板 → 计划任务 → 添加任务
  2. 任务类型:Shell 脚本
  3. 任务名称:织梦缓存清理
  4. 执行周期:每天 3:00
  5. 脚本内容:粘贴上面的脚本

宝塔会自动记录每次执行结果,方便回溯。

六、进阶:数据库优化脚本

除了文件清理,数据库也要定期优化。织梦的 dede_archives 等表频繁增删后会有碎片,定期 OPTIMIZE TABLE 回收空间:

#!/bin/bash
# dedecms_db_optimize.sh
DB_USER="root"
DB_PASS="yourpassword"
DB_NAME="dedecms"

mysql -u$DB_USER -p$DB_PASS $DB_NAME <<EOF
OPTIMIZE TABLE dede_archives;
OPTIMIZE TABLE dede_addonarticle;
OPTIMIZE TABLE dede_arctype;
OPTIMIZE TABLE dede_flink;
OPTIMIZE TABLE dede_member;
EOF

echo "[$(date)] 数据库优化完成" >> /var/log/dedecms_clean.log
OPTIMIZE TABLE 会锁表,建议在低峰期执行。大表优化耗时较长,可能影响访问。

七、监控磁盘占用

在脚本里加一段磁盘监控,超过阈值告警:

# 磁盘占用超 80% 告警
DISK_USE=$(df -P $DEDE_ROOT | awk 'NR==2{print $5}' | tr -d '%')
if [ $DISK_USE -gt 80 ]; then
    # 发送告警(需配置邮件或钉钉机器人)
    echo "警告:磁盘占用 ${DISK_USE}%,超过阈值" | mail -s "磁盘告警" admin@xxx.com
    log "警告:磁盘占用 ${DISK_USE}%"
fi

也可配合宝塔的“监控宝”或阿里云监控做更完善的告警。

八、安全注意事项

  • 脚本里不要硬编码数据库密码,用 .my.cnf 或环境变量
  • 脚本文件权限设为 700,仅 root 可读可执行
  • find ... -delete 前先用 -print 测试,确认匹配的文件无误
  • 不要清理 /data/config.*.inc.php 等配置文件
  • 清理前最好打包 /data/ 目录做备份
  • Session 清理要保留正在登录的用户,用 -mtime +1 只删超过 24 小时的

九、清理效果统计

脚本运行一段时间后,统计清理量:

# 查看最近30天清理日志
grep "删除" /var/log/dedecms_clean.log | tail -100

# 统计总清理文件数
grep "删除" /var/log/dedecms_clean.log | awk -F'删除' '{print $2}' | awk '{sum+=$1} END{print "总清理:"sum"个文件"}'

如果发现某次清理量异常大,说明站点可能有异常(如被刷 session、缓存不生效等),需排查。

十、常见问题

1. 清理后站点变慢

标签缓存被清空后,首次访问需要重新生成缓存,会有短暂变慢。属于正常现象,几次访问后恢复正常。建议在凌晨低峰期执行。

2. Session 清理后用户被踢下线

只清理超过 24 小时的 session 不会影响正常用户。如果误删了活跃 session,检查 -mtime 参数是否设得太短。

3. 脚本执行报权限错误

用 root 执行,或确保运行用户对 /data/ 目录有读写权限。宝塔环境用 www 用户执行。

缓存清理是织梦站点长期稳定运行的基础运维。建议把脚本纳入服务器初始化清单,新站点上线就部署好。配合日志监控和磁盘告警,能让织梦站点在无人值守的情况下持续稳定运行,省去大量手动维护的时间。