磁盘监控和日志清理脚本

脚本一:磁盘监控报警

#!/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"

需要我帮你调整阈值、邮箱或清理路径吗?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注