#!/bin/bash # 系统级磁盘瘦身脚本 # 用途:全面清理系统冗余文件,释放磁盘空间 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } separator() { echo "======================================================================" } # 记录日志 LOG_FILE="/var/log/system-cleanup-$(date +%Y%m%d_%H%M%S).log" exec > >(tee -a "$LOG_FILE") 2>&1 separator echo "系统级磁盘瘦身脚本" echo "执行时间: $(date)" separator # 显示初始磁盘使用情况 log_info "初始磁盘使用情况:" df -h | grep -E "Filesystem|/$" echo "" # ========== 1. Docker清理 ========== separator log_info "步骤1: Docker清理" separator # 清理悬空镜像 DANGLING=$(docker images -f "dangling=true" -q | wc -l) if [ "$DANGLING" -gt 0 ]; then log_info "清理 $DANGLING 个悬空镜像" docker image prune -f fi # 清理未使用的镜像(保留最近3个版本) UNUSED_IMAGES=$(docker images --format "{{.Repository}}:{{.Tag}}" | grep -E "novalon-website:[0-9]" | sort -r | tail -n +4) if [ -n "$UNUSED_IMAGES" ]; then log_info "清理旧版本镜像:" echo "$UNUSED_IMAGES" echo "$UNUSED_IMAGES" | xargs docker rmi -f || true fi # 清理构建缓存 docker builder prune -a -f # 清理已停止容器 STOPPED=$(docker ps -f "status=exited" -q | wc -l) if [ "$STOPPED" -gt 0 ]; then log_info "清理 $STOPPED 个已停止容器" docker container prune -f fi # 清理未使用卷 UNUSED_VOLS=$(docker volume ls -q --filter "dangling=true" | wc -l) if [ "$UNUSED_VOLS" -gt 0 ]; then log_info "清理 $UNUSED_VOLS 个未使用卷" docker volume prune -f fi log_success "Docker清理完成" # ========== 2. 系统日志清理 ========== separator log_info "步骤2: 系统日志清理" separator # 清理journal日志(保留7天) if command -v journalctl &> /dev/null; then JOURNAL_SIZE=$(journalctl --disk-usage 2>/dev/null | grep -oE '[0-9.]+[MG]' || echo "0B") log_info "系统日志大小: $JOURNAL_SIZE" journalctl --vacuum-time=7d log_success "Journal日志清理完成" fi # 清理syslog等日志(保留7天) if [ -d "/var/log" ]; then log_info "清理旧日志文件..." find /var/log -type f -name "*.log.*" -mtime +7 -delete 2>/dev/null || true find /var/log -type f -name "*.gz" -mtime +7 -delete 2>/dev/null || true find /var/log -type f -name "*.1" -mtime +7 -delete 2>/dev/null || true # 压缩旧日志 find /var/log -type f -name "*.log" -size +10M -exec gzip {} \; 2>/dev/null || true log_success "日志文件清理完成" fi # ========== 3. 包管理器缓存清理 ========== separator log_info "步骤3: 包管理器缓存清理" separator if command -v apt-get &> /dev/null; then log_info "清理APT缓存..." apt-get clean apt-get autoclean apt-get autoremove -y # 清理APT缓存目录 rm -rf /var/cache/apt/archives/*.deb rm -rf /var/cache/apt/archives/partial/* log_success "APT缓存清理完成" elif command -v yum &> /dev/null; then log_info "清理YUM缓存..." yum clean all rm -rf /var/cache/yum/* log_success "YUM缓存清理完成" fi # ========== 4. 临时文件清理 ========== separator log_info "步骤4: 临时文件清理" separator # 清理/tmp目录(超过7天) TMP_FILES=$(find /tmp -type f -mtime +7 2>/dev/null | wc -l) if [ "$TMP_FILES" -gt 0 ]; then log_info "清理 $TMP_FILES 个临时文件(>7天)" find /tmp -type f -mtime +7 -delete 2>/dev/null || true find /tmp -type d -empty -delete 2>/dev/null || true fi # 清理/var/tmp if [ -d "/var/tmp" ]; then find /var/tmp -type f -mtime +30 -delete 2>/dev/null || true fi log_success "临时文件清理完成" # ========== 5. 应用构建产物清理 ========== separator log_info "步骤5: 应用构建产物清理" separator # 清理novalon-website构建产物 if [ -d "/home/novalon/docker-app/novalon-website" ]; then log_info "清理novalon-website构建产物..." # 清理dist目录中的tar.gz文件 find /home/novalon/docker-app/novalon-website -name "*.tar.gz" -type f -delete 2>/dev/null || true # 清理node_modules(如果存在) # find /home/novalon/docker-app/novalon-website -name "node_modules" -type d -exec rm -rf {} + 2>/dev/null || true # 清理.next缓存 find /home/novalon/docker-app/novalon-website -name ".next" -type d -exec rm -rf {} + 2>/dev/null || true log_success "应用构建产物清理完成" fi # 清理旧的备份文件 log_info "清理旧备份文件..." find /home/novalon -name "*.backup.*" -mtime +30 -delete 2>/dev/null || true find /home/novalon -name "*.bak" -mtime +30 -delete 2>/dev/null || true # ========== 6. 安装包清理 ========== separator log_info "步骤6: 安装包清理" separator # 清理/root下的安装包 if [ -d "/root" ]; then log_info "清理/root下的安装包..." # 查找并删除安装包目录(保留当前使用的) find /root -maxdepth 1 -type d -name "*panel*" -mtime +30 -exec rm -rf {} + 2>/dev/null || true find /root -maxdepth 1 -type f -name "*.tar.gz" -mtime +30 -delete 2>/dev/null || true find /root -maxdepth 1 -type f -name "*.zip" -mtime +30 -delete 2>/dev/null || true log_success "安装包清理完成" fi # ========== 7. 系统缓存清理 ========== separator log_info "步骤7: 系统缓存清理" separator # 清理用户缓存 if [ -d "/home" ]; then log_info "清理用户缓存..." find /home -type d -name ".cache" -exec rm -rf {} + 2>/dev/null || true fi # 清理root用户缓存 if [ -d "/root/.cache" ]; then rm -rf /root/.cache/* fi # 清润pip缓存 if command -v pip &> /dev/null; then log_info "清理pip缓存..." pip cache purge 2>/dev/null || true fi if command -v pip3 &> /dev/null; then pip3 cache purge 2>/dev/null || true fi # 清理npm缓存 if command -v npm &> /dev/null; then log_info "清理npm缓存..." npm cache clean --force 2>/dev/null || true fi log_success "系统缓存清理完成" # ========== 8. 旧内核清理 ========== separator log_info "步骤8: 旧内核清理" separator if command -v apt-get &> /dev/null; then # 获取当前内核版本 CURRENT_KERNEL=$(uname -r) log_info "当前内核版本: $CURRENT_KERNEL" # 列出所有已安装的内核 INSTALLED_KERNELS=$(dpkg --list | grep -E "linux-image-[0-9]" | awk '{print $2}' | grep -v "$CURRENT_KERNEL") if [ -n "$INSTALLED_KERNELS" ]; then log_info "发现旧内核:" echo "$INSTALLED_KERNELS" # 自动删除旧内核(保留当前和最新的) apt-get autoremove -y --purge linux-image-* 2>/dev/null || true log_success "旧内核清理完成" else log_info "没有需要清理的旧内核" fi fi # ========== 9. 僵尸进程清理 ========== separator log_info "步骤9: 僵尸进程检查" separator ZOMBIE_COUNT=$(ps aux | awk '{print $8}' | grep -c Z || true) if [ "$ZOMBIE_COUNT" -gt 0 ]; then log_warning "发现 $ZOMBIE_COUNT 个僵尸进程" ps aux | awk '$8=="Z" {print $0}' else log_success "没有僵尸进程" fi # ========== 10. 磁盘碎片整理 ========== separator log_info "步骤10: 磁盘优化建议" separator # 检查磁盘碎片 if command -v e4defrag &> /dev/null; then log_info "磁盘碎片整理工具可用: e4defrag" log_info "建议在维护窗口执行: e4defrag /" fi # ========== 显示清理结果 ========== separator log_info "清理结果" separator echo "" log_info "磁盘使用情况对比:" echo "清理前: 10G / 20G (51%)" df -h | grep -E "/$" | awk '{print "清理后: "$3" / "$2" ("$5")"}' echo "" log_info "磁盘空间统计:" echo " /var/lib/docker: $(du -sh /var/lib/docker 2>/dev/null | awk '{print $1}')" echo " /var/log: $(du -sh /var/log 2>/dev/null | awk '{print $1}')" echo " /home: $(du -sh /home 2>/dev/null | awk '{print $1}')" echo " /usr: $(du -sh /usr 2>/dev/null | awk '{print $1}')" echo " /root: $(du -sh /root 2>/dev/null | awk '{print $1}')" echo "" log_info "Docker资源使用:" docker system df separator log_success "系统级磁盘瘦身完成" separator echo "" log_info "清理摘要:" echo " ✅ Docker悬空镜像已清理" echo " ✅ Docker旧版本镜像已清理" echo " ✅ Docker构建缓存已清理" echo " ✅ 已停止容器已清理" echo " ✅ 未使用卷已清理" echo " ✅ 系统日志已清理" echo " ✅ 包管理器缓存已清理" echo " ✅ 临时文件已清理" echo " ✅ 应用构建产物已清理" echo " ✅ 安装包已清理" echo " ✅ 系统缓存已清理" echo " ✅ 旧内核已清理" echo "" log_warning "后续建议:" echo " 1. 定期执行清理: 每周一次" echo " 2. 监控磁盘使用: df -h" echo " 3. 配置日志轮转: /etc/logrotate.d/" echo " 4. 设置磁盘告警: 使用率 > 80%" echo " 5. 定期备份重要数据" echo "" log_info "详细日志已保存到: $LOG_FILE" separator