使用 df 命令获取磁盘使用率,结合 mail 命令发送邮件,并通过 crontab 定时执行。适用所有标准 Linux 服务器,风险在于邮件服务未配置导致告警发送失败。
先说结论:Shell 脚本监控磁盘空间需依赖系统邮件服务或第三方 SMTP,配置完成后由 cron 定期触发。
- 适合:所有具备 root 权限的 Linux 服务器环境
- 先准备:确认 mail 命令可用或配置 SMTP 中继
- 验收:手动触发脚本并检查收件箱是否收到告警
命令速用版
以下脚本监控根分区使用率,超过 80% 发送邮件告警,可直接保存为 /usr/local/bin/disk_monitor.sh。
#!/bin/bash
THRESHOLD=80
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -ge "$THRESHOLD" ]; then
echo "Disk usage is ${USAGE}%" | mail -s "Disk Alert" admin@example.com
fi赋予执行权限:chmod +x /usr/local/bin/disk_monitor.sh。
为什么会这样
磁盘空间耗尽会导致服务无法写入日志或数据,进而引发宕机。人工检查存在时间间隔,无法实时发现突发增长,自动化脚本能弥补监控盲区。
分步处理
第一步:确认邮件发送功能可用。执行 echo "test" | mail -s "test" your@email.com,检查收件箱是否收到邮件。若 mail 命令不存在,需安装 mailx 或配置 postfix/ssmtp。
第二步:编写监控脚本。将速用版脚本保存至服务器,修改 THRESHOLD 阈值和收件人地址。确保脚本第一行指定解释器路径,避免 cron 执行失败。
第三步:配置定时任务。执行 crontab -e,添加 0 * * * * /usr/local/bin/disk_monitor.sh,表示每小时执行一次。保存后无需重启 cron 服务。
第四步:设置日志记录。建议在脚本中追加日志输出,如 echo "$(date): Checked" >> /var/log/disk_monitor.log,便于排查脚本是否运行。
怎么验证是否生效
手动执行脚本:/usr/local/bin/disk_monitor.sh,观察是否立即收到邮件。检查 cron 日志:grep CRON /var/log/syslog 或 /var/log/cron,确认任务是否按时触发。查看脚本日志:cat /var/log/disk_monitor.log,确认执行时间点。
常见坑
邮件服务未启动:很多最小化安装的 Linux 默认不运行 mail 服务,需先配置 SMTP 中继或使用外部 API。误报 tmpfs 分区:df 命令默认包含 tmpfs,其使用率波动大,建议指定监控物理分区如/dev/sda1。阈值设置过低:若设置为 50%,可能频繁收到告警,建议根据业务写入速度设置为 80% 或 90%。
常见问题
mail 命令发送失败怎么办
检查本地 MTA 服务状态,或改用 curl 调用第三方邮件 API 发送告警。
如何排除特定分区不监控
在 df 命令后 grep -v 特定挂载点,或使用 awk 筛选特定设备名。
脚本执行了但没收到邮件
检查垃圾邮件箱,确认收件地址拼写正确,查看 /var/spool/mail 本地队列是否堆积。
如何监控多个分区
使用 df -h 遍历所有挂载点,通过 while 循环逐个判断使用率并发送告警。