脚本一:磁盘监控报警
#!/bin/bash
# 监控磁盘使用率,超过90%发邮件
THRESHOLD=90
EMAIL="你的邮箱@example.com"
df -h | grep -E '^/dev/' | while read line; do
USAGE=$(echo $line | awk '{print $5}' | cut -d'%' -f1)
MOUNT=$(echo $line | awk '{print $6}')
if [ $USAGE -ge $THRESHOLD ]; then
echo "$(date) - 警告:$MOUNT 使用率 $USAGE%" >> /var/log/disk_alert.log
echo "服务器 $(hostname) 的 $MOUNT 分区使用率达 $USAGE%" | mail -s "磁盘空间报警" $EMAIL
fi
done
使用方法:
chmod +x disk_monitor.sh
./disk_monitor.sh
# 添加到 crontab(每10分钟执行)
crontab -e
*/10 * * * * /root/disk_monitor.sh
脚本二:定时清理30天前日志
#!/bin/bash
# 清理30天前的 .log 文件
LOG_DIRS="/var/log /var/log/nginx /var/log/mysql"
DAYS=30
for dir in $LOG_DIRS; do
if [ -d "$dir" ]; then
find $dir -type f -name "*.log" -mtime +$DAYS -delete
find $dir -type f -name "*.log.*" -mtime +$DAYS -delete
echo "$(date) - 清理 $dir 中 $DAYS 天前的日志" >> /var/log/clean_logs.log
fi
done
使用方法:
chmod +x clean_logs.sh
./clean_logs.sh
# 添加到 crontab(每天凌晨2点执行)
crontab -e
0 2 * * * /root/clean_logs.sh
脚本三:自动排查磁盘空间问题
#!/bin/bash
# 一键排查磁盘空间问题
echo "========== 磁盘空间检查 =========="
df -h | grep -E '^/dev/'
echo ""
echo "========== Inode使用情况 =========="
df -i | grep -E '^/dev/'
echo ""
echo "========== 根目录下最大的5个目录 =========="
du -sh /* 2>/dev/null | sort -hr | head -5
echo ""
echo "========== 当前目录下最大的5个文件/目录 =========="
du -sh * 2>/dev/null | sort -hr | head -5
echo ""
echo "========== 占用空间最大的10个文件 =========="
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -hrk 5 | head -10
echo ""
echo "========== 已删除但被进程占用的文件 =========="
lsof | grep deleted | head -10
echo ""
echo "========== 排查建议 =========="
echo "1. 如果磁盘空间满,清理大文件:rm -f 文件路径"
echo "2. 如果Inode满,清理小文件:find /目录 -type f -mtime +30 -delete"
echo "3. 日志文件建议用 truncate -s 0 清空,不要直接 rm"
echo "4. 清理包缓存:yum clean all 或 apt clean"
echo "5. 清理Docker:docker system prune -a -f"
使用方法:
chmod +x disk_check.sh
./disk_check.sh
📌 三个脚本一键安装
cat > disk_monitor.sh << 'EOF'
#!/bin/bash
THRESHOLD=90
EMAIL="admin@example.com"
df -h | grep '^/dev/' | while read line; do
USAGE=$(echo $line | awk '{print $5}' | cut -d'%' -f1)
MOUNT=$(echo $line | awk '{print $6}')
[ $USAGE -ge $THRESHOLD ] && echo "$(date) - $MOUNT $USAGE%" >> /var/log/disk_alert.log
done
EOF
cat > clean_logs.sh << 'EOF'
#!/bin/bash
for dir in /var/log /var/log/nginx /var/log/mysql; do
[ -d "$dir" ] && find $dir -type f -name "*.log*" -mtime +30 -delete
done
EOF
cat > disk_check.sh << 'EOF'
#!/bin/bash
echo "=== 磁盘空间 ==="; df -h | grep '^/dev/'
echo "=== Inode ==="; df -i | grep '^/dev/'
echo "=== 最大目录 ==="; du -sh /* 2>/dev/null | sort -hr | head -5
EOF
chmod +x disk_monitor.sh clean_logs.sh disk_check.sh
echo "三个脚本已创建:disk_monitor.sh, clean_logs.sh, disk_check.sh"
需要我帮你调整阈值、邮箱或清理路径吗?
发表回复