|
#!/bin/bash |
|
|
|
|
|
|
|
|
|
|
|
|
|
WORDPRESS_ROOT="/var/www/html" |
|
LOG_FILE="/var/log/wordpress/cleanup.log" |
|
RETENTION_DAYS=365 |
|
DRY_RUN=false |
|
|
|
|
|
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}" |
|
|
|
|
|
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" |
|
"wp-config.php" |
|
"index.php" |
|
".htaccess" |
|
"*.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 "清理旧日志文件..." |
|
|
|
|
|
find "/var/log" -name "*.log" -type f -mtime +30 -exec rm -f {} \; 2>/dev/null |
|
|
|
|
|
find "/var/log" -name "*.log" -type f -size +10M -exec gzip {} \; 2>/dev/null |
|
} |
|
|
|
|
|
cleanup_temp_files() { |
|
log_message "清理临时文件..." |
|
|
|
|
|
find /tmp -name "php*" -type f -mtime +1 -delete 2>/dev/null |
|
|
|
|
|
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 |
|
} |
|
|
|
|
|
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}%),建议检查大文件" |
|
|
|
|
|
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 |