本文目录导读:

我来帮你写一个自动检查磁盘空间的脚本,包含多种方案和功能:
基础版(检查磁盘使用率并告警)
#!/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值
- 测试环境:建议先在测试环境运行验证
- 日志管理:定期清理日志文件,避免磁盘占用
你可以根据实际需求选择合适的方案,或者组合使用,需要调整参数或者有其他问题,随时告诉我!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播