帮助中心 >
  关于云服务器 >
  日本云服务器磁盘快满了怎么办?一个自动报警脚本搞定
日本云服务器磁盘快满了怎么办?一个自动报警脚本搞定
时间 : 2025-12-22 16:06:45
编辑 : Jtti

日本云服务器的磁盘空间耗尽会导致无法写入新内容、数据库崩溃、日志记录停止,甚至整个服务不可以。和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`),避免敏感信息泄露。如果涉及调用特殊命令,需确保执行用户有相应权限。

最终,这个脚本的价值远不止于一行判断语句。它构建了一个从监测、判断、告警到辅助排障的自动化闭环。在日本云服务器环境中,你可以进一步将其与监控系统(如ZabbixPrometheus)集成,或者使用更高级的配置管理工具(如Ansible)批量部署到所有服务器上。

售前客服
JTTI-Ellis
JTTI-Jean
JTTI-Amano
JTTI-Coco
JTTI-Eom
JTTI-Selina
JTTI-Defl
技术支持
JTTI-Noc
标题
电子邮件地址
类型
销售问题
销售问题
系统问题
售后问题
投诉与建议
市场合作
信息
验证码
提交