wordpress / monitor-cleanup.sh
CatPtain's picture
Upload monitor-cleanup.sh
127d978 verified
raw
history blame
5.68 kB
#!/bin/bash
# WordPress文件自动清理脚本
# 删除超过1年的文件,保持系统整洁
# 适配Hugging Face Spaces环境
# 配置变量
WORDPRESS_ROOT="/var/www/html"
LOG_FILE="/var/log/wordpress/cleanup.log"
RETENTION_DAYS=365 # 保留天数(1年)
DRY_RUN=false # 设置为true进行测试运行
# 创建日志目录
mkdir -p "$(dirname "$LOG_FILE")"
# 日志函数
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 获取文件大小(人类可读格式)
get_size() {
du -sh "$1" 2>/dev/null | cut -f1
}
# 开始清理
log_message "=== 开始自动清理任务 ==="
log_message "保留期限: ${RETENTION_DAYS} 天"
log_message "WordPress根目录: ${WORDPRESS_ROOT}"
# 检查WordPress目录是否存在
if [ ! -d "$WORDPRESS_ROOT" ]; then
log_message "错误: WordPress目录不存在: $WORDPRESS_ROOT"
exit 1
fi
# 统计变量
total_files_checked=0
total_files_deleted=0
total_size_freed=0
# 需要清理的目录列表
cleanup_dirs=(
"$WORDPRESS_ROOT/wp-content/uploads"
"$WORDPRESS_ROOT/wp-content/cache"
"$WORDPRESS_ROOT/wp-content/backup"
"$WORDPRESS_ROOT/wp-content/temp"
"/tmp"
"/var/log/wordpress"
)
# 排除的文件和目录模式
exclude_patterns=(
"*.db" # 数据库文件
"*.sql" # SQL备份文件
"wp-config.php" # 配置文件
"index.php" # 索引文件
".htaccess" # Apache配置
"*.log" # 当前日志文件(单独处理)
)
# 检查文件是否应该被排除
should_exclude() {
local file="$1"
local basename=$(basename "$file")
for pattern in "${exclude_patterns[@]}"; do
if [[ "$basename" == $pattern ]]; then
return 0 # 应该排除
fi
done
return 1 # 不排除
}
# 清理指定目录
cleanup_directory() {
local dir="$1"
if [ ! -d "$dir" ]; then
log_message "跳过不存在的目录: $dir"
return
fi
log_message "清理目录: $dir"
# 查找超过保留期限的文件
while IFS= read -r -d '' file; do
total_files_checked=$((total_files_checked + 1))
# 检查是否应该排除
if should_exclude "$file"; then
continue
fi
# 获取文件大小
file_size=$(get_size "$file")
if [ "$DRY_RUN" = true ]; then
log_message "[测试模式] 将删除: $file (大小: $file_size)"
else
log_message "删除文件: $file (大小: $file_size)"
if rm -f "$file" 2>/dev/null; then
total_files_deleted=$((total_files_deleted + 1))
else
log_message "警告: 无法删除文件: $file"
fi
fi
done < <(find "$dir" -type f -mtime +$RETENTION_DAYS -print0 2>/dev/null)
# 删除空目录
if [ "$DRY_RUN" = false ]; then
find "$dir" -type d -empty -delete 2>/dev/null
fi
}
# 清理日志文件(保留最近的日志)
cleanup_logs() {
log_message "清理旧日志文件..."
# 保留最近30天的日志,删除更老的
find "/var/log" -name "*.log" -type f -mtime +30 -exec rm -f {} \; 2>/dev/null
# 压缩大于10MB的当前日志文件
find "/var/log" -name "*.log" -type f -size +10M -exec gzip {} \; 2>/dev/null
}
# 清理临时文件
cleanup_temp_files() {
log_message "清理临时文件..."
# 清理PHP临时文件
find /tmp -name "php*" -type f -mtime +1 -delete 2>/dev/null
# 清理WordPress临时文件
find "$WORDPRESS_ROOT" -name "*.tmp" -type f -mtime +1 -delete 2>/dev/null
find "$WORDPRESS_ROOT" -name "*.temp" -type f -mtime +1 -delete 2>/dev/null
}
# 清理WordPress缓存
cleanup_wordpress_cache() {
log_message "清理WordPress缓存..."
# 清理对象缓存
if [ -d "$WORDPRESS_ROOT/wp-content/cache" ]; then
find "$WORDPRESS_ROOT/wp-content/cache" -type f -mtime +7 -delete 2>/dev/null
fi
# 清理页面缓存
if [ -d "$WORDPRESS_ROOT/wp-content/page-cache" ]; then
find "$WORDPRESS_ROOT/wp-content/page-cache" -type f -mtime +7 -delete 2>/dev/null
fi
}
# 执行清理任务
for dir in "${cleanup_dirs[@]}"; do
cleanup_directory "$dir"
done
# 执行特殊清理任务
cleanup_logs
cleanup_temp_files
cleanup_wordpress_cache
# 获取磁盘使用情况
disk_usage=$(df -h "$WORDPRESS_ROOT" | awk 'NR==2 {print $5}' | sed 's/%//')
# 记录清理结果
log_message "=== 清理任务完成 ==="
log_message "检查文件数: $total_files_checked"
log_message "删除文件数: $total_files_deleted"
log_message "当前磁盘使用率: ${disk_usage}%"
# 如果磁盘使用率过高,发出警告
if [ "$disk_usage" -gt 80 ]; then
log_message "警告: 磁盘使用率过高 (${disk_usage}%),建议检查大文件"
# 列出最大的10个文件
log_message "最大的10个文件:"
find "$WORDPRESS_ROOT" -type f -exec du -h {} + 2>/dev/null | sort -rh | head -10 | while read size file; do
log_message " $size - $file"
done
fi
# 清理完成后的系统信息
log_message "系统信息:"
log_message " 内存使用: $(free -h | awk 'NR==2{printf "%.1f%%", $3*100/$2 }')"
log_message " 磁盘使用: ${disk_usage}%"
log_message " 负载平均: $(uptime | awk -F'load average:' '{print $2}')"
log_message "=== 清理任务结束 ==="
echo ""
# 如果是测试模式,提醒用户
if [ "$DRY_RUN" = true ]; then
log_message "注意: 这是测试运行,没有实际删除文件"
log_message "要执行实际清理,请将脚本中的 DRY_RUN 设置为 false"
fi
exit 0