CentOS7自动化磁盘清理脚本

前言

在 Linux 运维中,磁盘空间耗尽(No space left on device) 是导致服务宕机的头号杀手之一。手动维护存在以下致命缺陷:

  • 人为遗忘:日志文件(如 /var/log)、应用备份包、临时文件会持续累积,运维人员极易忘记清理。
  • 合规性需求:等保要求数据保留周期不超过特定天数(如 30 天),需自动化落地。
  • 误操作风险:手动执行 rm -rf 若路径写错(如误删 /lib)可能导致系统崩溃。
  • 最小化环境限制:生产服务器多为最小化安装,缺少图形界面和高级监控工具,必须依赖最基础的 Shell 脚本和 Crond 服务。

因此,编写一个安全、可配置、有日志的自动化清理脚本,并通过定时任务定期执行,是运维的标准实践。


环境准备

脚本依赖以下基础服务,通常最小化安装已自带。

  1. 定时任务服务(Cronie)

    # 检查是否已安装
    rpm -qa | grep cronie
    
    # 验证服务状态(确保开机自启且运行中)
    systemctl status crond
    # 若未启用,则启用
    systemctl enable crond   
    
  2. 日志轮转(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
  • 时间格式说明分 时 日 月 周
posted @ 2026-06-29 16:35  克峰同学  阅读(7)  评论(0)    收藏  举报