本文目录导读:

#!/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
使用方法
-
保存脚本:
sudo vim /usr/local/bin/clean_yum_cache.sh
-
添加执行权限:
sudo chmod +x /usr/local/bin/clean_yum_cache.sh
-
执行脚本:
# 普通运行 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
脚本功能特点
- 多种清理方式:使用
yum clean all、yum clean metadata、yum clean packages、基于时间的文件清理 - 磁盘监控:当磁盘空间低于阈值时自动提示清理
- 日志记录:所有操作记录到指定日志文件
- 安全保护:需要 root 权限运行,支持
--dry-run试运行模式 - 灵活配置:可自定义清理天数、最低磁盘空间阈值、日志文件路径
注意事项
- 脚本需要 root 权限运行
- 清理后需要重新下载软件包元数据,可能影响后续软件安装速度
- 建议在系统负载较低时执行