怎么用脚本限制磁盘使用率

wen 实用脚本 3

**
《从失控到可控:用脚本构建磁盘使用率的“智能警戒线”》

怎么用脚本限制磁盘使用率


目录导读

  1. 为什么你需要一台“会说话”的磁盘——监控的必要性
  2. 脚本监控的底层逻辑——不是写代码,是定规则
  3. 三步实战:从探测到自动清理(含Shell/Python双版本示例)
  4. 进阶策略:预测性清理与异常告警
  5. 高频问答:磁盘脚本的五大“翻车”现场与解法

为什么你需要一台“会说话”的磁盘

服务器磁盘写满,是运维事故中“最沉默的杀手”,日志文件悄悄膨胀、临时缓存忘记清理、备份任务异常堆积——当SSD或HDD使用率达到95%时,数据库会直接宕机,Web服务返回500错误,而你的监控系统却可能毫无反应。

脚本限制磁盘使用率的核心价值,不是“事后清理”,而是建立一条动态阈值防线:当使用率超过既定水位(如80%),系统自动执行预设动作,比如删除7天前的日志、压缩大文件、甚至暂停非核心服务,这比手动df -h检查高效得多,也远比依赖人工“想起来才清理”可靠。

脚本监控的底层逻辑

所谓“脚本”,本质是三个动作的循环

  • 探测:用df命令(Linux)或Get-PSDrive(Windows PowerShell)获取当前使用率。
  • 判断:将数值与阈值比较(例如>=85)。
  • 动作:触发清理命令,或调用API发送告警。

关键设计原则是“双阈值”

  • 软阈值(如75%):触发温和清理(如删除旧缓存)。
  • 硬阈值(如90%):触发强制操作(如暂停写日志、发送邮件)。
    这样避免脚本频繁“小题大做”,也防止磁盘彻底被写满。

三步实战:从探测到自动清理

示例场景:Linux服务器,主要占用来自/var/log和临时目录/tmp

Step 1:核心探测命令

#!/bin/bash  
# 获取根分区使用率(去掉%号)  
usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')  
echo "当前使用率: ${usage}%"  

Step 2:条件执行与安全清理

if [ "$usage" -ge 80 ]; then  
    echo "警告:使用率超80%,清理7天前的日志"  
    find /var/log -type f -name "*.log" -mtime +7 -delete  
    find /tmp -type f -mtime +2 -delete  
    # 重新检查使用率  
    usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')  
    echo "清理后使用率: ${usage}%"  
fi  

Step 3:放入定时任务(cron)

# 每天凌晨2点执行清理脚本  
0 2 * * * /root/disk_guard.sh >> /var/log/disk_guard.log 2>&1  

进阶Python版本(更易扩展)

import shutil  
import os  
def check_and_clean(threshold=80, path='/'):  
    total, used, free = shutil.disk_usage(path)  
    usage_percent = (used / total) * 100  
    if usage_percent > threshold:  
        # 清理逻辑,如删除过期文件  
        os.system('find /tmp -name "*.tmp" -delete')  
        print(f"已清理,当前使用率: {usage_percent:.1f}%")  
    else:  
        print(f"状态正常: {usage_percent:.1f}%")  
check_and_clean(threshold=75)  

进阶策略:预测性清理与异常告警

高级脚本不应只依赖“当前状态”,而应计算增长速率

思路:两次采样间隔5分钟,获取使用率增长率Δ%,若当前使用率 + Δ% × 60 > 95,则判定未来1小时会写满,提前触发清理。

告警集成

# 调用企业微信机器人或邮件  
if [ "$usage" -gt 90 ]; then  
    curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx" \  
    -H 'Content-Type: application/json' \  
    -d '{"msgtype": "text", "text": {"content": "⚠️ 磁盘告警:根分区已用90%"}}'  
fi  

防御性清理很重要:避免误删用户数据,脚本中必须将删除操作限定在明确的目录白名单(如/var/log/tmp/home/backup/old),且删除前打印文件列表到日志,便于审计。

高频问答:磁盘脚本的五大“翻车”现场与解法

Q1:脚本删除文件后,使用率不降反升?
原因:被删除的文件可能正被进程占用(尤其日志文件),解法:删除前先lsof | grep deleted找到进程,或使用truncate -s 0 /path/to/log清空而非删除文件。

Q2:cron任务不执行,脚本手动跑没问题?
原因:cron环境变量PATH不完整,解法:在脚本开头写入#!/bin/bash,并使用绝对路径(如/usr/bin/find),或添加PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Q3:磁盘使用率波动大,脚本频繁误报?
解法:引入“滑动窗口”机制,比如连续3次检查超过阈值才触发动作,建议在脚本中记录状态到临时文件,比对两次检查结果。

Q4:Windows服务器怎么办?
PowerShell示例:Get-PSDrive C | Select-Object @{N='UsedPercent';E={[math]::Round(($_.Used/$_.Size)*100)}},配合“任务计划程序”定时运行。

Q5:如何避免脚本自己占用磁盘(日志膨胀)?
解法:脚本日志仅保留最近30天,或使用logrotate管理脚本自己的日志文件。



用脚本限制磁盘使用率,本质上是用最小代码量去模拟运维专家的日常巡检动作,它不追求华丽算法,而要求稳定、可审计、易回滚,当你把清理动作做成幂等操作(重复执行无害),并配上清晰的日志,就能让服务器在“无人值班”的状态下,始终保持呼吸顺畅,脚本是工具,阈值是决策,而磁盘里的数据,才是你真正要守护的资产。

抱歉,评论功能暂时关闭!