日本云服务器的磁盘空间耗尽会导致无法写入新内容、数据库崩溃、日志记录停止,甚至整个服务不可以。和CPU或内存顺时峰值不同,磁盘使用率会缓慢增长直至爆满,这恰恰给了我们通过自动化手段进行预警和干预的机会。编写一个在文件系统使用率大于90%时自动报警的Linux Shell脚本,是每位服务器管理员都应掌握的基础技能。这个脚本的核心任务非常明确:定期检查、准确判断、及时通知。
实现这个目标,主要依赖Linux内置的 `df` 命令。但我们需要的是能够被脚本轻松解析的格式化数据。常用的 `df -h` 虽然对人类友好,但包含 `G`、`T`、`%` 等符号,不利于精确比较。因此,在脚本中我们使用 `df --output=pcent,target` 或更通用的 `df -P` 结合 `awk` 来获取纯净的百分比数字。`-P` 参数确保以POSIX标准格式输出,避免换行问题。一个获取根分区使用率的命令示例是:`df -P / | awk 'NR==2 {print $5}' | tr -d '%'`,它能直接输出一个整数(如 `85`)。
基于此,我们可以构建脚本的核心逻辑。首先,它需要定义一个清晰的报警阈值(例如90%)。然后,遍历系统中所有挂载的文件系统,或者仅监控重要的分区(如 `/`、`/home`、`/var`)。对于每个分区,提取其使用率数值并与阈值比较。如果超过阈值,则触发报警动作。一个基础版本的脚本框架如下:
#!/bin/bash
# 文件名:disk_usage_monitor.sh
# 功能:检查磁盘使用率,超过阈值时发送报警
# 设置报警阈值(百分比)
THRESHOLD=90
# 设置需要监控的挂载点,如果要监控所有,可以使用 `df -hP | awk 'NR>1 {print $6}'`
MOUNTPOINTS="/ /home /var /boot"
# 循环检查每个挂载点
for mountpoint in $MOUNTPOINTS; do
# 获取该挂载点的使用率(去掉百分号)
USAGE=$(df -P "$mountpoint" | awk 'NR==2 {print $5}' | tr -d '%')
# 检查使用率是否超过阈值
if [ "$USAGE" -ge "$THRESHOLD" ]; then
# 获取当前时间、主机名等上下文信息,构建报警消息
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
HOSTNAME=$(hostname)
MESSAGE="【磁盘空间警报】 时间:$CURRENT_TIME 主机:$HOSTNAME 挂载点:$mountpoint 使用率:$USAGE% 已超过阈值 ${THRESHOLD}%!请立即清理。"
# 此处应调用报警发送函数
echo "$MESSAGE" >&2 # 先打印到标准错误输出作为演示
# send_alert "$MESSAGE" # 实际发送报警
fi
done
然而,仅有判断逻辑是不够的。一个健壮的报警脚本必须包含有效的通知机制,确保警告能送达管理员。最简单的办法是发送电子邮件,利用 `mailx` 或 `sendmail` 命令。但邮件可能延迟或被忽略,因此集成更即时的方式如钉钉、企业微信、Slack或短信API是生产环境的常见做法。以下是一个扩展的报警函数示例,它同时支持日志记录和邮件发送:
# 报警与日志函数
LOG_FILE="/var/log/disk_alert.log"
send_alert() {
local msg="$1"
# 1. 记录到本地日志文件(务必确保日志目录存在且有写入权限)
echo "$(date '+%Y-%m-%d %H:%M:%S') - $msg" >> "$LOG_FILE"
# 2. 发送电子邮件(假设系统已配置好邮件发送)
echo "$msg" | mailx -s "【重要】服务器磁盘空间告警 - $(hostname)" admin@yourdomain.com
# 3. 发送到钉钉机器人(需要网络连通性和Webhook URL)
# DING_WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
# curl -s "$DING_WEBHOOK_URL" -H 'Content-Type: application/json' -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$msg\"}}" > /dev/null
# 4. 可以在严重情况下尝试重启某些服务或清理临时文件(谨慎操作)
# if [ "$USAGE" -ge 95 ]; then
# echo "尝试清理 /tmp 目录..."
# find /tmp -type f -mtime +7 -delete 2>/dev/null | head -50
# fi
}
将脚本保存后,通过:
chmod +x disk_usage_monitor.sh
赋予执行权限。最关键的一步是将其加入 `crontab` 实现定期自动检查。例如,在 `/etc/crontab` 中添加一行,表示每10分钟以root身份运行一次:
*/10 * * * * root /usr/local/bin/disk_usage_monitor.sh
对于生产环境,还需要考虑以下几个重要方面以提升脚本的可靠性:
防止报警风暴:在报警逻辑中加入“休眠期”机制。可以写入一个状态文件记录上次报警时间,如果短时间内重复触发(例如一小时内),则不再发送新报警,避免刷屏。
更精细的排查:报警时,脚本可以自动运行
du -sh /path/to/mountpoint/* | sort -rh | head -10
找出占用空间最大的前10个目录或文件,并将结果一并附在报警信息中,极大节省人工排查时间。
配置文件化:将 `THRESHOLD`、`MOUNTPOINTS`、接收报警的邮箱、Webhook URL等参数提取到单独的配置文件中,方便不同服务器复用和修改,无需改动脚本主体。
安全与权限:确保脚本和日志文件的权限设置合理(如 `root:root` 和 `644`),避免敏感信息泄露。如果涉及调用特殊命令,需确保执行用户有相应权限。
最终,这个脚本的价值远不止于一行判断语句。它构建了一个从监测、判断、告警到辅助排障的自动化闭环。在日本云服务器环境中,你可以进一步将其与监控系统(如Zabbix、Prometheus)集成,或者使用更高级的配置管理工具(如Ansible)批量部署到所有服务器上。
CN
EN