CentOS7自动化磁盘清理脚本
前言
在 Linux 运维中,磁盘空间耗尽(No space left on device) 是导致服务宕机的头号杀手之一。手动维护存在以下致命缺陷:
- 人为遗忘:日志文件(如
/var/log)、应用备份包、临时文件会持续累积,运维人员极易忘记清理。 - 合规性需求:等保要求数据保留周期不超过特定天数(如 30 天),需自动化落地。
- 误操作风险:手动执行
rm -rf若路径写错(如误删/lib)可能导致系统崩溃。 - 最小化环境限制:生产服务器多为最小化安装,缺少图形界面和高级监控工具,必须依赖最基础的 Shell 脚本和 Crond 服务。
因此,编写一个安全、可配置、有日志的自动化清理脚本,并通过定时任务定期执行,是运维的标准实践。
环境准备
脚本依赖以下基础服务,通常最小化安装已自带。
-
定时任务服务(Cronie)
# 检查是否已安装 rpm -qa | grep cronie # 验证服务状态(确保开机自启且运行中) systemctl status crond # 若未启用,则启用 systemctl enable crond -
日志轮转(logrotate,可选)
# 检查是否已安装 rpm -q logrotate
核心原理与指令解析
在 Linux 中,高效清理旧文件的标准组合是 find 配合 -print 和 -delete。
基础命令格式
find 目标目录 -type f -name "*.zip" -mtime +30 -print -delete
-type f:只匹配普通文件,防止误删目录结构。-name:匹配对应文件,我这里是zip,按照自己需要来。-mtime +30:匹配修改时间在 31天前(即超过 30*24 小时)的文件。-print:输出find 匹配到的文件。-delete:直接删除find 匹配到的文件。
案例:定时删除备份压缩包
编写脚本
文件名:dssc.sh
#!/bin/bash
#定时清理过时zip文件
## 配置参数
DIR="/home/oracle/oracle_db_bak" # 待清理的目标目录(绝对路径)
MASK="*.zip" # 匹配的文件名模式,如 "*.log.gz"
DAYS=30 # 保留天数(超过此天数将被删除)
LOG="${DIR}/dssc.log" # 操作日志文件
DRY=true # 是否仅预览(true=不删除,仅输出匹配文件)
# 函数:记录日志
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"
}
# 主函数
main() {
# 检查目标目录是否存在
if [ ! -d "$DIR" ]; then
log "错误:目标目录 $DIR 不存在,脚本退出"
exit 1
fi
# 构建 find 命令
local find_cmd="find $DIR -type f -name \"$MASK\" -mtime +$DAYS"
# 预览模式(仅输出,不删除)
if [ "$DRY" = true ]; then
log "【预览模式】将列出匹配文件(不执行删除)"
eval "$find_cmd -print" | while IFS= read -r file; do
log "预览:$file"
done
local count=$(eval "$find_cmd -print" | wc -l)
log "预览完成,共 $count 个文件"
exit 0
fi
# 正式删除模式(先统计,再删除,并记录)
log "开始清理:目录=$DIR,模式=$MASK,保留天数=$DAYS"
# 先统计数量(防止删除过程中 find 重新计算,此处先统计)
local total_files=$(eval "$find_cmd -print" | wc -l)
if [ "$total_files" -eq 0 ]; then
log "没有找到需要清理的文件,退出"
exit 0
fi
log "共找到 $total_files 个待删除文件,开始删除..."
# 执行删除,并将删除的文件逐条记录
eval "$find_cmd -delete" | while IFS= read -r file; do
log "已删除:$file"
done
# 二次验证:再次统计剩余数量
local remain_files=$(eval "$find_cmd -print" 2>/dev/null | wc -l)
log "清理完成,剩余 $remain_files 个文件"
}
main
放置脚本并赋予执行权限
# 目标目录上传脚本
rz dssc.sh
# 赋予执行权限
chmod +x dssc.sh
# 解决未预期的符号(可选)
sed -i 's/\r$//' dssc.sh
手动执行一遍脚本
# 预览模式下执行一遍确认
bash dssc.sh
# 确认无误后,改为 false 再执行
# vi dssc.sh 修改 DRY=false
bash dssc.sh
使用crontab设置定时执行
# 编辑当前用户的定时任务(使用那个用户自己决定)
crontab -e
# 三选一
## 添加一条定时规则(每天凌晨 2:30 执行)
30 2 * * * /home/oracle/oracle_db_bak/dssc.sh
## 添加一条定时规则(每周日凌晨 2:30 执行)
30 2 * * 0 /home/oracle/oracle_db_bak/dssc.sh
## 添加一条定时规则(每月一日凌晨 2:30 执行)
30 2 1 * 0 /home/oracle/oracle_db_bak/dssc.sh
# 保存并退出(:wq)
# 查看已设置的定时任务
crontab -l
- 时间格式说明:
分 时 日 月 周

浙公网安备 33010602011771号