自动检查磁盘空间的脚本怎么写

wen 实用脚本 2

本文目录导读:

自动检查磁盘空间的脚本怎么写

  1. 方案一:基础版(检查磁盘使用率并告警)
  2. 方案二:进阶版(包含日志和多种通知方式)
  3. 方案三:简化版(适合crontab使用)
  4. 方案四:带清理功能的高级版
  5. 使用方法
  6. 注意事项

我来帮你写一个自动检查磁盘空间的脚本,包含多种方案和功能:

基础版(检查磁盘使用率并告警)

#!/bin/bash
# 磁盘空间检查脚本 - 基础版
# 用途:检查磁盘使用率,超过阈值时发出告警
# 设置阈值(百分比),超过此值触发告警
THRESHOLD=80
# 邮件通知(可选)
EMAIL="admin@example.com"
# 当前日期时间
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "磁盘空间检查 - $DATE"
echo "================================"
# 检查磁盘使用情况
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read output; do
    # 获取各字段
    filesystem=$(echo $output | awk '{print $1}')
    usage=$(echo $output | awk '{print $5}' | sed 's/%//')
    mountpoint=$(echo $output | awk '{print $6}')
    # 如果使用率超过阈值
    if [ $usage -ge $THRESHOLD ]; then
        echo "警告: $filesystem 挂载在 $mountpoint 使用率已达到 ${usage}%"
        # 发送邮件通知(可选)
        if [ ! -z "$EMAIL" ]; then
            echo "警告: $filesystem 使用率已达到 ${usage}%" | mail -s "磁盘空间告警 - $DATE" $EMAIL
        fi
        # 显示占用最大的文件(可选)
        echo "占用最大的前5个文件:"
        find $mountpoint -xdev -type f -size +100M -exec du -h {} \; 2>/dev/null | sort -rh | head -5
    else
        echo "正常: $filesystem 使用率 ${usage}%"
    fi
done

进阶版(包含日志和多种通知方式)

#!/bin/bash
# 磁盘空间检查脚本 - 进阶版
# 功能:日志记录、多种告警方式、历史记录分析
# 配置
THRESHOLD_WARN=70     # 警告阈值
THRESHOLD_CRITICAL=90 # 严重阈值
LOG_FILE="/var/log/disk_check.log"
HISTORY_FILE="/var/log/disk_history.log"
EMAIL="admin@example.com"
WEBHOOK_URL=""  # Slack或企业微信Webhook地址
# 创建日志目录
mkdir -p $(dirname "$LOG_FILE")
# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 发送邮件通知
send_email() {
    local subject="$1"
    local body="$2"
    echo "$body" | mail -s "$subject" "$EMAIL" 2>/dev/null
}
# 发送Webhook通知(适用于Slack、企业微信等)
send_webhook() {
    if [ ! -z "$WEBHOOK_URL" ]; then
        curl -s -X POST -H 'Content-Type: application/json' \
             -d "{\"text\":\"$1\"}" \
             "$WEBHOOK_URL" 2>/dev/null
    fi
}
# 主检查函数
check_disk() {
    local issues=0
    local critical_issues=0
    log "开始磁盘空间检查"
    # 创建历史记录文件
    if [ ! -f "$HISTORY_FILE" ]; then
        echo "时间,文件系统,使用率,挂载点" > "$HISTORY_FILE"
    fi
    # 检查所有挂载点
    df -hP | grep -vE '^Filesystem|tmpfs|cdrom|loop' | while read -r line; do
        filesystem=$(echo "$line" | awk '{print $1}')
        usage=$(echo "$line" | awk '{print $5}' | sed 's/%//')
        mountpoint=$(echo "$line" | awk '{print $6}')
        size=$(echo "$line" | awk '{print $2}')
        used=$(echo "$line" | awk '{print $3}')
        # 记录历史数据
        echo "$(date '+%Y-%m-%d %H:%M:%S'),$filesystem,$usage,$mountpoint" >> "$HISTORY_FILE"
        # 检查严重情况
        if [ "$usage" -ge "$THRESHOLD_CRITICAL" ]; then
            critical_issues=$((critical_issues + 1))
            message="严重警告: $filesystem 挂载于 $mountpoint,使用率已达到 ${usage}%(已用 $used / 总共 $size)"
            log "⚠️ $message"
            send_email "严重: 磁盘空间不足" "$message"
            send_webhook "🚨 $message"
        # 检查警告情况
        elif [ "$usage" -ge "$THRESHOLD_WARN" ]; then
            issues=$((issues + 1))
            message="警告: $filesystem 挂载于 $mountpoint,使用率已达到 ${usage}%(已用 $used / 总共 $size)"
            log "⚠️ $message"
            send_email "警告: 磁盘空间不足" "$message"
            send_webhook "⚠️ $message"
        fi
    done
    # 如果没有任何问题
    if [ $critical_issues -eq 0 ] && [ $issues -eq 0 ]; then
        log "✅ 所有磁盘空间正常"
    fi
}
# 清理旧日志(保留30天)
cleanup_logs() {
    find "$(dirname "$LOG_FILE")" -name "*.log" -mtime +30 -delete 2>/dev/null
}
# 主执行
main() {
    check_disk
    cleanup_logs
    # 可选:生成周报
    if [ "$(date +%u)" -eq 1 ]; then  # 每周一
        log "生成周报..."
        # 这里可以添加生成周报的代码
    fi
}
# 运行主函数
main "$@"

简化版(适合crontab使用)

#!/bin/bash
# 快速磁盘检查,适合crontab定期执行
# 使用方法:*/30 * * * * /path/to/disk_check.sh
THRESHOLD=85
LOG=/var/log/disk_alert.log
df -hP | awk 'NR>1 && $1 !~ /tmpfs/ && $1 !~ /loop/ {print $5, $6}' | while read line; do
    usage=$(echo $line | awk '{print $1}' | tr -d '%')
    mount=$(echo $line | awk '{print $2}')
    if [ $usage -gt $THRESHOLD ]; then
        echo "[$(date)] WARNING: $mount used ${usage}%" >> $LOG
        # 添加其他通知方式
    fi
done
# 如果没有任何警告,记录状态
if [ ! -s $LOG ]; then
    echo "[$(date)] All disk usage is normal" >> $LOG
fi

带清理功能的高级版

#!/bin/bash
# 磁盘检查并智能清理
# 注意:清理功能需要谨慎使用
# 配置
THRESHOLD=80
CLEAN_THRESHOLD=95  # 当达到此阈值时执行清理
DATA_DIRS="/var/log /tmp /var/tmp"  # 需要检查清理的目录
# 当磁盘使用率超过阈值时的清理函数
cleanup_disk() {
    local mountpoint=$1
    local usage=$2
    echo "正在清理 $mountpoint 上的临时文件..."
    # 清理临时文件(超过7天的)
    find $DATA_DIRS -type f -mtime +7 -name "*.log" -exec rm -f {} \; 2>/dev/null
    # 清理临时锁文件
    find /tmp -type f -name "*.lock" -delete 2>/dev/null
    # 清理yum/apt缓存
    if command -v yum &> /dev/null; then
        yum clean all 2>/dev/null
    elif command -v apt-get &> /dev/null; then
        apt-get clean 2>/dev/null
    fi
    # 清理日志文件(保留最近3天)
    find /var/log -type f -name "*.log.*" -mtime +3 -delete 2>/dev/null
}
# 主检查循环
df -hP | grep -vE '^Filesystem|tmpfs|cdrom' | while read -r line; do
    usage=$(echo "$line" | awk '{print $5}' | sed 's/%//')
    mountpoint=$(echo "$line" | awk '{print $6}')
    if [ "$usage" -gt "$THRESHOLD" ]; then
        echo "磁盘使用率告警: $mountpoint 使用率 ${usage}%"
        # 如果超过严重阈值,执行清理
        if [ "$usage" -gt "$CLEAN_THRESHOLD" ]; then
            echo "执行清理操作..."
            cleanup_disk "$mountpoint" "$usage"
        fi
    fi
done

使用方法

  1. 保存脚本:将脚本保存为 disk_check.sh
  2. 赋予执行权限
    chmod +x disk_check.sh
  3. 测试运行
    ./disk_check.sh
  4. 添加定时任务(crontab):
    crontab -e
    # 添加以下行(每小时执行一次)
    0 * * * * /path/to/disk_check.sh
    # 或每30分钟执行
    */30 * * * * /path/to/disk_check.sh

注意事项

  1. 权限问题:某些命令可能需要root权限
  2. 通知设置:邮件通知需要配置mail服务(如sendmail或postfix)
  3. 阈值调整:根据实际需求调整THRESHOLD值
  4. 测试环境:建议先在测试环境运行验证
  5. 日志管理:定期清理日志文件,避免磁盘占用

你可以根据实际需求选择合适的方案,或者组合使用,需要调整参数或者有其他问题,随时告诉我!

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