本文最后更新于 2025-10-11,文章内容可能已经过时。

服务器磁盘监控与文件迁移方案

一、监控硬盘使用率并发送邮件通知

1. 安装和配置邮件服务

Sendmail安装配置

# 安装Sendmail邮件服务
sudo yum install sendmail sendmail-cf -y

编辑Sendmail配置文件 /etc/mail/sendmail.mc,将 DAEMON_OPTIONS行中的 127.0.0.1改为 0.0.0.0,以便任何主机都可以访问Sendmail服务。

# 生成Sendmail配置文件
sudo make -C /etc/mail/

2. 创建磁盘监控脚本

创建脚本 /usr/local/bin/disk_usage_alert.sh

#!/bin/bash

# 定义阈值(以百分比表示)
threshold=75

# 获取当前磁盘使用率(根分区)
disk_usage=$(df -h | awk '$NF=="/"{print substr($5,1,length($5)-1)}')

# 检查磁盘使用率是否超过阈值
if [ $disk_usage -gt $threshold ]; then
    # 发送邮件通知
    echo "警告:磁盘使用率已超过阈值!当前使用率:$disk_usage%" | mail -s "磁盘使用率警告" admin@example.com
fi

更健壮的磁盘监控脚本示例​:

#!/bin/bash

# 设置阈值和收件人
THRESHOLD=75
EMAIL="admin@example.com,ops@example.com"
LOG_FILE="/var/log/disk_monitor.log"

# 检查所有分区
df -hP | grep -v tmpfs | awk 'NR>1 {print $5, $6}' | while read usage mount_point; do
    # 移除百分号,转换为数字
    usage_num=${usage%\%}
    
    if [ $usage_num -gt $THRESHOLD ]; then
        alert_msg="警告:分区 $mount_point 使用率已达 $usage,超过阈值 ${THRESHOLD}%!"
        echo "$(date +"%Y-%m-%d %H:%M:%S") - $alert_msg" >> $LOG_FILE
        
        # 发送邮件告警
        echo "$alert_msg" | mail -s "【磁盘告警】服务器 $(hostname)" $EMAIL
        
        # 查找大文件前3名
        big_files=$(find $mount_point -type f -exec du -h {} + 2>/dev/null | sort -rh | head -3)
        echo "占用空间最大的3个文件:" >> $LOG_FILE
        echo "$big_files" >> $LOG_FILE
    fi
done

3. 设置定时任务

# 给脚本添加执行权限
sudo chmod +x /usr/local/bin/disk_usage_alert.sh

# 编辑crontab
sudo crontab -e

# 添加以下行(每分钟检查一次)
* * * * * /usr/local/bin/disk_usage_alert.sh > /dev/null 2>&1

# 或者每天特定时间检查(如每小时检查一次)
0 * * * * /usr/local/bin/disk_usage_alert.sh > /dev/null 2>&1

二、大文件或目录跨服务器转移

1. 使用SCP命令进行文件传输

基本语法:​

scp <源服务器用户名>@<源服务器IP地址>:<源文件路径> <目标服务器用户名>@<目标服务器IP地址>:<目标文件路径>

文件传输示例:​

# 单个文件传输
scp root@192.168.0.1:/data/tomcat/logs/catalina.out root@192.168.0.2:/data/logs/

# 需要输入目标服务器密码

目录传输示例:​

# 传输目录下所有文件
scp root@192.168.0.1:/data/tomcat/logs/* root@192.168.0.2:/data/logs/

# 递归传输整个目录(加-r参数)
scp -r root@192.168.0.1:/data/tomcat/logs/ root@192.168.0.2:/data/logs/

2. 高级文件传输选项

使用rsync进行增量同步(更高效):​

# 安装rsync
sudo yum install rsync -y

# 同步目录(只传输变化的部分)
rsync -avz -e ssh root@192.168.0.1:/data/tomcat/logs/ root@192.168.0.2:/data/logs/

参数说明:​

  • -a:归档模式,保持文件属性

  • -v:详细输出

  • -z:压缩传输

  • -e ssh:使用SSH加密传输

三、使用sendEmail进行高级邮件通知

1. 安装sendEmail

# 下载安装包
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz

# 解压
tar zxf sendEmail-v1.56.tar.gz -C /usr/src/

# 进入解压目录并安装
cd /usr/src/sendEmail-v1.56/
cp -a sendEmail /usr/local/bin/

2. 创建多收件人监控脚本

创建脚本 /usr/local/bin/warning-by-shaun.sh

#!/bin/bash

# 定义阈值
threshold=75

# 收件人列表(多个邮箱用逗号分隔)
mail_receive="demo1@onmicrosoft.com,demo2@88.com,demo3@111.com"

# 发件人配置
mail_sender="demo@88.com"
smtp_server="smtp.88.com"
smtp_user="demo@88.com"
smtp_pass="发件人邮箱授权密码"

# 获取磁盘使用率
disk_usage=$(df -h | awk '$NF=="/"{print substr($5,1,length($5)-1)}')

# 检查是否超过阈值
if [ $disk_usage -gt $threshold ]; then
    # 发送邮件给多个收件人
    /usr/local/bin/sendEmail \
        -o message-charset=utf8 \
        -f $mail_sender \
        -t $mail_receive \
        -s $smtp_server \
        -u "【紧急】磁盘使用率警告 - 服务器 $(hostname)" \
        -xu $smtp_user \
        -xp $smtp_pass \
        -m "警告:服务器 $(hostname) 的磁盘使用率已超过阈值!
        
当前使用率:$disk_usage%
阈值设置:$threshold%
检查时间:$(date +"%Y-%m-%d %H:%M:%S")
        
请及时清理磁盘空间或迁移大文件。
        
磁盘详细信息:
$(df -h)
        
占用空间前5的目录:
$(du -h --max-depth=1 / 2>/dev/null | sort -hr | head -5)" \
        >> /usr/local/bin/output.log 2>&1
fi

3. sendEmail参数详解

参数

说明

示例

-f

发件人邮箱

-f sender@example.com

-t

收件人邮箱(多个用逗号分隔)

-t user1@ex.com,user2@ex.com

-s

SMTP服务器地址

-s smtp.exmail.qq.com

-u

邮件主题

-u "磁盘空间告警"

-xu

SMTP认证用户名

-xu sender@example.com

-xp

SMTP认证密码/授权码

-xp your_password

-m

邮件正文内容

-m "警告内容..."

-a

附件文件路径

-a /path/to/file.log

-o

其他选项(编码等)

-o message-charset=utf8

四、自动化文件清理和迁移方案

1. 结合监控的自动清理脚本

#!/bin/bash

# 配置参数
THRESHOLD=75
BACKUP_SERVER="192.168.0.2"
BACKUP_USER="root"
BACKUP_PATH="/data/backups/$(hostname)"
LOG_FILE="/var/log/auto_clean.log"

# 检查磁盘使用率
usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')

if [ $usage -gt $THRESHOLD ]; then
    echo "$(date): 磁盘使用率 $usage% 超过阈值,开始清理..." >> $LOG_FILE
    
    # 查找大文件(大于100MB)
    big_files=$(find /var/log /tmp -type f -size +100M 2>/dev/null | head -5)
    
    for file in $big_files; do
        if [ -f "$file" ]; then
            # 备份到远程服务器
            scp $file $BACKUP_USER@$BACKUP_SERVER:$BACKUP_PATH/ &&
            # 清空原文件(保留文件结构)
            > $file &&
            echo "$(date): 已迁移并清空 $file" >> $LOG_FILE
        fi
    done
fi

2. 设置日志轮转防止磁盘爆满

# 配置logrotate自动管理日志
sudo vi /etc/logrotate.d/custom_logs

# 添加以下内容
/var/log/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    copytruncate
}

五、实用技巧和注意事项

1. 监控脚本优化建议

  • 多级阈值告警​:设置不同级别的阈值(如80%警告,90%紧急)

  • 告警频率控制​:避免频繁告警,可以设置告警间隔时间

  • 日志记录​:所有操作记录日志便于排查问题

  • 进程锁机制​:防止脚本重复执行

2. 安全注意事项

  • 使用SSH密钥认证避免密码传输

  • 定期更新脚本和检查监控有效性

  • 设置适当的文件权限保护敏感信息

  • 测试邮件发送功能确保告警可达

这个方案提供了从基础监控到高级自动化的完整解决方案,您可以根据实际需求进行调整和扩展。