Disk Space Monitor

2026年3月13日 boss

磁盘空间监控脚本

监控服务器磁盘使用率,自动清理指定目录下的过期文件,超过阈值发送告警通知。

#!/bin/bash
# disk_monitor.sh

THRESHOLD=80          # 告警阈值(%)
CRITICAL=90           # 严重阈值(%)
ALERT_EMAIL=""        # 告警邮箱
LOG_RETAIN_DAYS=30    # 日志保留天数
BACKUP_RETAIN_DAYS=90 # 备份保留天数

echo "=== 磁盘空间监控 ==="
echo "$(date)"
echo ""

ALERT_MSG=""

# 检查所有挂载点
df -h | grep '^/dev/' | while read line; do
    MOUNT=$(echo "$line" | awk '{print $6}')
    USAGE=$(echo "$line" | awk '{print $5}' | tr -d '%')
    SIZE=$(echo "$line" | awk '{print $2}')
    USED=$(echo "$line" | awk '{print $3}')
    AVAIL=$(echo "$line" | awk '{print $4}')
    
    echo "$MOUNT: 已用 $USED/$SIZE (${USAGE}%) 剩余 $AVAIL"
    
    if [ "$USAGE" -ge "$CRITICAL" ]; then
        ALERT_MSG="$ALERT_MSG\nCRITICAL: $MOUNT 使用率 ${USAGE}% >= ${CRITICAL}%"
    elif [ "$USAGE" -ge "$THRESHOLD" ]; then
        ALERT_MSG="$ALERT_MSG\nWARNING: $MOUNT 使用率 ${USAGE}% >= ${THRESHOLD}%"
    fi
done

# 自动清理过期日志
echo ""
echo "=== 自动清理 ==="
CLEANED=0

# 清理Nginx日志(>30天)
if [ -d /var/log/nginx ]; then
    COUNT=$(find /var/log/nginx -name "*.gz" -mtime +$LOG_RETAIN_DAYS -delete -print | wc -l)
    echo "清理Nginx过期日志: ${COUNT}个文件"
    CLEANED=$((CLEANED + COUNT))
fi

# 清理MySQL慢查询日志(>30天)
if [ -d /var/log/mysql ]; then
    COUNT=$(find /var/log/mysql -name "slow.log.*" -mtime +$LOG_RETAIN_DAYS -delete -print | wc -l)
    echo "清理MySQL过期日志: ${COUNT}个文件"
    CLEANED=$((CLEANED + COUNT))
fi

# 清理PHP-FPM日志(>30天)
if [ -d /var/log/php-fpm ]; then
    COUNT=$(find /var/log/php-fpm -name "*.log.*" -mtime +$LOG_RETAIN_DAYS -delete -print | wc -l)
    echo "清理PHP-FPM过期日志: ${COUNT}个文件"
    CLEANED=$((CLEANED + COUNT))
fi

echo "共清理 ${CLEANED} 个文件"

# 发送告警
if [ -n "$ALERT_MSG" ] && [ -n "$ALERT_EMAIL" ]; then
    echo -e "$ALERT_MSG" | mail -s "磁盘空间告警 $(hostname)" "$ALERT_EMAIL"
fi

关于作者

boss

发表评论