本文目录导读:

我来帮你写一个自动检查磁盘空间的脚本,包含多种方案和功能:
基础版(检查磁盘使用率并告警)
#!/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
使用方法
- 保存脚本:将脚本保存为
disk_check.sh - 赋予执行权限:
chmod +x disk_check.sh
- 测试运行:
./disk_check.sh
- 添加定时任务(crontab):
crontab -e # 添加以下行(每小时执行一次) 0 * * * * /path/to/disk_check.sh # 或每30分钟执行 */30 * * * * /path/to/disk_check.sh
注意事项
- 权限问题:某些命令可能需要root权限
- 通知设置:邮件通知需要配置mail服务(如sendmail或postfix)
- 阈值调整:根据实际需求调整THRESHOLD值
- 测试环境:建议先在测试环境运行验证
- 日志管理:定期清理日志文件,避免磁盘占用
你可以根据实际需求选择合适的方案,或者组合使用,需要调整参数或者有其他问题,随时告诉我!