从实列中学习linux shell5: 利用shell 脚本 检测硬盘空间容量,当使用量达到80%的时候 发送邮件

下面是用于检测硬盘空间并在使用量达到80%时发送邮件的Shell脚本

第一步 编写脚本

bash 复制代码
#!/bin/bash

# 邮件配置
recipient="zhaoqingyou@99qhzt.com"
subject="磁盘空间警报"
mail_cmd="/usr/bin/mail"  # 根据实际邮件命令路径修改

# 检查是否安装邮件工具
if [ ! -f "$mail_cmd" ]; then
    echo "错误:邮件发送工具未安装,请先执行以下命令安装:"
    echo "Debian/Ubuntu: sudo apt-get install mailutils"
    echo "CentOS/RHEL: sudo yum install mailx"
    exit 1
fi

# 获取所有磁盘分区信息
df -h | while read -r line; do
    # 跳过标题行和临时文件系统
    if [[ $line == Filesystem* ]] || [[ $line == *tmpfs* ]]; then
        continue
    fi

    # 提取使用百分比(去掉%符号)
    usage=$(echo $line | awk '{print $5}' | tr -d '%')
    mount_point=$(echo $line | awk '{print $6}')

    # 判断使用率是否超过80%
    if [ "$usage" -ge 80 ]; then
        # 获取完整磁盘信息
        disk_info=$(df -h $mount_point)
        
        # 构造邮件内容
        message="警告:磁盘空间使用超过阈值!
        
        详细信息:
        $disk_info
        
        请及时清理磁盘空间!
        服务器:$(hostname)
        检测时间:$(date +"%Y-%m-%d %H:%M:%S")"

        # 发送邮件
        echo "$message" | $mail_cmd -s "$subject" $recipient
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] 已发送警报邮件:$mount_point 使用率 ${usage}%"
    fi
done

第二步 使用方法

  1. 保存脚本为 disk_monitor.sh

  2. 赋予执行权限:

    bash 复制代码
    chmod +x disk_monitor.sh
  3. 配置邮件系统(以Ubuntu为例):

    bash 复制代码
    sudo apt-get install mailutils
    sudo dpkg-reconfigure postfix  # 选择Internet Site,其他保持默认
  4. 测试脚本:

    bash 复制代码
    ./disk_monitor.sh

设置定时任务(每天检查):

bash 复制代码
crontab -e

添加以下内容(每天8点检查):

bash 复制代码
0 8 * * * /path/to/disk_monitor.sh

关键功能说明:

  1. df -h:获取人类可读的磁盘使用信息
  2. awk '{print $5}':提取使用百分比列
  3. tr -d '%':移除百分号用于数值比较
  4. mail 命令:发送邮件的核心工具
  5. 自动过滤tmpfs等临时文件系统
  6. 包含详细磁盘信息和服务器标识

第三步 增强功能建议

  1. 多阈值分级报警:

    bash 复制代码
    if [ "$usage" -ge 90 ]; then
        subject="紧急!磁盘空间警报"
    elif [ "$usage" -ge 80 ]; then
        subject="警告!磁盘空间警报"
    fi
  2. 添加日志记录:

    bash 复制代码
    log_file="/var/log/disk_monitor.log"
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $mount_point 使用率 ${usage}%" >> $log_file
  3. 排除特定挂载点(如NFS):

    bash 复制代码
    if [[ $mount_point == /nfs* ]]; then
        continue
    fi

最后 注意事项

  1. 确保mail命令路径正确(使用which mail查看)
  2. 测试时可将阈值临时改为50%方便验证
  3. 生产环境建议使用企业级监控系统(如Zabbix、Prometheus)运维人员和公司资金到位的情况下
相关推荐
乌托邦的逃亡者10 分钟前
Dockerfile的配置和使用
linux·运维·docker·容器
小此方13 分钟前
Re:Linux系统篇(三)指令篇 · 二:十二个高频指令精讲+重定向操作+“一切皆文件“深入理解
linux·运维·服务器
十五年专注C++开发18 分钟前
MobaXterm:Windows 远程工作全能工具箱
linux·windows·mobaxterm
wohehe22 分钟前
Android项目工程化-Github Actions
linux·github
richxu2025100144 分钟前
嵌入式学习之路->stm32篇->(11)SPI通信(下)
stm32·嵌入式硬件·学习
xuhaoyu_cpp_java1 小时前
连接池学习
数据库·经验分享·笔记·学习
用户1401056775191 小时前
线上接口偶发超时,最后发现是 conntrack 打满:一次网络故障排查实战
运维
以太浮标1 小时前
华为eNSP模拟器综合实验之- 主机没有配置缺省网关时,通过路由式Proxy ARP实现通信(arp-proxy enable)
运维·网络·网络协议·华为·智能路由器·信息与通信
REDcker2 小时前
Linux disown命令详解 后台作业脱管与终端退出
linux·运维·chrome
cyber_两只龙宝2 小时前
【Oracle】Oracle之SQL的转换函数和条件表达式
linux·运维·数据库·sql·云原生·oracle