磁盘空间监控脚本
监控服务器磁盘使用率,自动清理指定目录下的过期文件,超过阈值发送告警通知。
#!/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