自动清理yum缓存的脚本

wen 实用脚本 1

本文目录导读:

自动清理yum缓存的脚本

  1. 强制运行(不询问用户)
  2. 试运行(只显示要清理的内容,不实际执行)
  3. 清理 7 天前的缓存
#!/bin/bash
#=================================================
# 脚本名称: clean_yum_cache.sh
# 功能描述: 自动清理 YUM 缓存
# 适用系统: CentOS/RHEL/Fedora 等使用 yum 的系统
#=================================================
# 配置部分
LOG_FILE="/var/log/yum_clean.log"        # 日志文件路径
CLEAN_DAYS=30                            # 清理超过多少天的缓存(如果使用基于时间的清理)
MIN_SPACE_MB=500                         # 当磁盘空间低于此值时强制清理(单位 MB)
DRY_RUN=false                            # 是否只显示不执行(设置 true 时只显示要删除的文件)
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 函数:记录日志
log_message() {
    local message="$1"
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    echo -e "${timestamp} - ${message}" | tee -a "$LOG_FILE"
}
# 函数:检查是否 root 用户
check_root() {
    if [[ $EUID -ne 0 ]]; then
        echo -e "${RED}错误: 此脚本必须以 root 用户运行${NC}" >&2
        exit 1
    fi
}
# 函数:获取磁盘使用情况
check_disk_space() {
    local yum_cache_dir="/var/cache/yum"
    local mount_point=$(df "$yum_cache_dir" | tail -1 | awk '{print $6}')
    local available_mb=$(df -m "$yum_cache_dir" | tail -1 | awk '{print $4}')
    echo "YUM 缓存目录磁盘空间: ${available_mb}MB 可用"
    if [[ $available_mb -lt $MIN_SPACE_MB ]]; then
        log_message "${YELLOW}磁盘空间不足 (${available_mb}MB < ${MIN_SPACE_MB}MB),将执行强制清理${NC}"
        return 0  # 需要清理
    fi
    return 1  # 不需要强制清理
}
# 函数:显示当前缓存大小
show_cache_size() {
    local cache_dir="/var/cache/yum"
    if [[ -d "$cache_dir" ]]; then
        local size=$(du -sh "$cache_dir" 2>/dev/null | cut -f1)
        echo "当前 YUM 缓存大小: ${size}"
    else
        echo "YUM 缓存目录不存在"
    fi
}
# 函数:清理 YUM 缓存
clean_yum_cache() {
    log_message "开始清理 YUM 缓存..."
    # 显示清理前的缓存大小
    show_cache_size
    # 方法1: 使用 yum clean 命令
    if [[ "$DRY_RUN" == false ]]; then
        log_message "执行: yum clean all"
        yum clean all >> "$LOG_FILE" 2>&1
        local yum_clean_status=$?
        if [[ $yum_clean_status -eq 0 ]]; then
            log_message "${GREEN}yum clean all 执行成功${NC}"
        else
            log_message "${RED}yum clean all 执行失败 (错误码: $yum_clean_status)${NC}"
        fi
        # 方法2: 额外清理 metadata 和 packages
        log_message "执行: yum clean metadata"
        yum clean metadata >> "$LOG_FILE" 2>&1
        log_message "执行: yum clean packages"
        yum clean packages >> "$LOG_FILE" 2>&1
        # 方法3: 清理过期缓存文件(基于时间)
        if [[ -d "/var/cache/yum" ]]; then
            log_message "清理 ${CLEAN_DAYS} 天前的缓存文件..."
            find /var/cache/yum -type f -mtime +${CLEAN_DAYS} -delete 2>/dev/null
            find /var/cache/yum -type d -empty -delete 2>/dev/null
        fi
    else
        # DRY RUN 模式
        log_message "【DRY RUN】以下操作将被执行:"
        echo "  - yum clean all"
        echo "  - yum clean metadata"
        echo "  - yum clean packages"
        echo "  - 删除 /var/cache/yum 中 ${CLEAN_DAYS} 天前的文件"
        if [[ -d "/var/cache/yum" ]]; then
            local old_files=$(find /var/cache/yum -type f -mtime +${CLEAN_DAYS} 2>/dev/null)
            if [[ -n "$old_files" ]]; then
                echo "  - 将删除以下过期文件:"
                echo "$old_files" | head -20
                local count=$(echo "$old_files" | wc -l)
                echo "  - 共 ${count} 个过期文件,此处仅显示前20个"
            fi
        fi
    fi
    # 显示清理后的缓存大小
    if [[ "$DRY_RUN" == false ]]; then
        show_cache_size
    fi
    log_message "YUM 缓存清理完成"
}
# 函数:清理特定仓库的缓存
clean_specific_repo() {
    local repo_name="$1"
    if [[ -n "$repo_name" ]]; then
        log_message "清理特定仓库缓存: ${repo_name}"
        if [[ "$DRY_RUN" == false ]]; then
            yum clean --enablerepo="${repo_name}" packages >> "$LOG_FILE" 2>&1
            yum clean --enablerepo="${repo_name}" metadata >> "$LOG_FILE" 2>&1
        else
            echo "  - 将清理仓库: ${repo_name}"
        fi
    fi
}
# 主函数
main() {
    check_root
    echo "========================================="
    echo "    自动清理 YUM 缓存脚本"
    echo "========================================="
    # 检查磁盘空间
    check_disk_space
    local needs_clean=$?
    # 如果没有指定 --force,且磁盘空间充足,则询问用户
    if [[ $needs_clean -ne 0 ]]; then
        read -p "磁盘空间充足,是否继续清理?(y/n): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            echo "操作取消"
            exit 0
        fi
    fi
    # 执行清理
    clean_yum_cache
    # 可选:清理所有已启用仓库
    read -p "是否清理所有已启用仓库的缓存?(y/n): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        # 获取所有已启用仓库
        repos=$(yum repolist enabled 2>/dev/null | grep -E "^[a-zA-Z]" | awk '{print $1}')
        for repo in $repos; do
            clean_specific_repo "$repo"
        done
    fi
    echo "========================================="
    echo "脚本执行完毕"
    echo "日志文件: $LOG_FILE"
    echo "========================================="
}
# 参数解析
while [[ $# -gt 0 ]]; do
    case "$1" in
        --force|-f)
            # 强制清理,不询问用户
            export FORCE=true
            shift
            ;;
        --dry-run|-d)
            # 试运行模式,只显示不执行
            DRY_RUN=true
            shift
            ;;
        --days|-d)
            # 设置清理天数
            if [[ -n "$2" ]]; then
                CLEAN_DAYS="$2"
                shift 2
            fi
            ;;
        --help|-h)
            echo "用法: $0 [选项]"
            echo "选项:"
            echo "  --force, -f    强制清理,不询问用户"
            echo "  --dry-run, -d  试运行模式,只显示要执行的操作"
            echo "  --days, -d N   清理 N 天前的缓存文件 (默认: 30)"
            echo "  --help, -h     显示帮助信息"
            exit 0
            ;;
        *)
            echo "未知参数: $1"
            echo "使用 --help 查看帮助"
            exit 1
            ;;
    esac
done
# 执行主函数
main

使用方法

  1. 保存脚本

    sudo vim /usr/local/bin/clean_yum_cache.sh
  2. 添加执行权限

    sudo chmod +x /usr/local/bin/clean_yum_cache.sh
  3. 执行脚本

    # 普通运行
    sudo /usr/local/bin/clean_yum_cache.sh

强制运行(不询问用户)

sudo /usr/local/bin/clean_yum_cache.sh --force

试运行(只显示要清理的内容,不实际执行)

sudo /usr/local/bin/clean_yum_cache.sh --dry-run

清理 7 天前的缓存

sudo /usr/local/bin/clean_yum_cache.sh --days 7


4. **设置定时任务**(每周自动清理):
```bash
sudo crontab -e
# 添加以下行,每周日凌晨2点执行
0 2 * * 0 /usr/local/bin/clean_yum_cache.sh --force >> /var/log/yum_clean_cron.log 2>&1

脚本功能特点

  1. 多种清理方式:使用 yum clean allyum clean metadatayum clean packages、基于时间的文件清理
  2. 磁盘监控:当磁盘空间低于阈值时自动提示清理
  3. 日志记录:所有操作记录到指定日志文件
  4. 安全保护:需要 root 权限运行,支持 --dry-run 试运行模式
  5. 灵活配置:可自定义清理天数、最低磁盘空间阈值、日志文件路径

注意事项

  • 脚本需要 root 权限运行
  • 清理后需要重新下载软件包元数据,可能影响后续软件安装速度
  • 建议在系统负载较低时执行

抱歉,评论功能暂时关闭!