本文目录导读:

#!/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 权限运行
- 清理后需要重新下载软件包元数据,可能影响后续软件安装速度
- 建议在系统负载较低时执行
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播