Python磁盘监控案例如何监控磁盘空间

wen python案例 26

Python磁盘监控实战:如何高效监控磁盘空间并自动预警

📚 目录导读

  1. 为什么需要磁盘监控?

    磁盘满溢的常见场景与后果

    Python磁盘监控案例如何监控磁盘空间

  2. 核心原理:Python如何获取磁盘信息

    跨平台方案对比(psutil vs os.statvfs)

  3. 完整代码实现:从检测到预警
    • 基础版:单磁盘空间检查
    • 进阶版:多磁盘、阈值配置与日志记录
  4. 自动化执行:结合定时任务与邮件告警

    使用crontab / Windows任务计划实现定时检测

  5. 常见问题与优化建议

    权限问题、性能开销、容器环境适配

  6. Q&A问答精选

    针对实际开发中的高频疑问答疑


为什么需要磁盘监控?

磁盘空间告警是系统运维中最基础也最容易忽略的需求,想象一下:数据库写入失败、日志文件撑爆分区、容器因磁盘满紧急停止——这些往往发生在凌晨3点,根据Google SRE报告,约12%的线上事故与磁盘容量不足直接相关。

传统做法是使用df -h手动查看,但手动检测无法做到实时与自动,Python凭借强大的跨平台库psutil,可以轻松实现跨Linux/Windows/macOS的统一监控逻辑。


核心原理:Python如何获取磁盘信息

1 使用psutil库(推荐)

psutil是Python系统监控的瑞士军刀,支持:

  • psutil.disk_partitions() — 获取所有挂载点
  • psutil.disk_usage(path) — 返回磁盘使用量对象(total, used, free, percent)
import psutil
for part in psutil.disk_partitions():
    if part.fstype not in ['proc', 'sysfs', 'devtmpfs']:
        usage = psutil.disk_usage(part.mountpoint)
        print(f"{part.mountpoint}: {usage.percent}% used")

2 跨平台对比:os.statvfs(Linux/Unix)

系统原生接口os.statvfs()返回底层块信息,但Windows不兼容,且计算繁琐,因此生产环境首选psutil


完整代码实现:从检测到预警

1 基础版:单磁盘空间检查

import psutil
import datetime
def check_disk_usage(path='/', threshold=80):
    usage = psutil.disk_usage(path)
    percent = usage.percent
    free_gb = usage.free / (1024**3)
    print(f"[{datetime.datetime.now()}] {path}: {percent:.1f}% used, {free_gb:.2f} GB free")
    if percent > threshold:
        print(f"⚠️ 磁盘空间告警!{path} 使用率已达 {percent}%")
        # 可在此触发邮件/短信告警
        return False
    return True
if __name__ == "__main__":
    check_disk_usage('/')

2 进阶版:多磁盘、阈值配置与日志记录

import psutil
import logging
from datetime import datetime
# 配置日志
logging.basicConfig(
    filename='disk_monitor.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
def advanced_disk_monitoring(config):
    warnings = []
    for mount in config['mount_points']:
        try:
            usage = psutil.disk_usage(mount['path'])
            percent = usage.percent
            threshold = mount.get('threshold', config['default_threshold'])
            msg = f"{mount['path']}: {percent:.1f}% (阈值: {threshold}%)"
            logging.info(msg)
            if percent > threshold:
                warning_msg = f"⚠️ 磁盘告警!{mount['path']} 使用率 {percent}% 超过阈值 {threshold}%"
                warnings.append(warning_msg)
                logging.warning(warning_msg)
        except Exception as e:
            logging.error(f"检查 {mount['path']} 时出错: {e}")
    # 处理告警:邮件、钉钉、Slack等
    if warnings and config.get('alert_method') == 'email':
        send_alert_email(warnings)
    return len(warnings) == 0
# 配置示例
config = {
    'default_threshold': 80,
    'mount_points': [
        {'path': '/', 'threshold': 85},
        {'path': '/data', 'threshold': 90},
        {'path': '/var/log'}
    ],
    'alert_method': 'email'
}
advanced_disk_monitoring(config)

自动化执行:结合定时任务与邮件告警

1 Linux系统(crontab)

# 每小时第5分钟检查一次
5 * * * * cd /path/to/script && python3 disk_monitor.py

2 Windows Task Scheduler

通过schtasks命令或图形界面,设置每日/每小时触发Python脚本。

3 集成邮件告警(使用smtplib)

import smtplib
from email.mime.text import MIMEText
def send_alert_email(warnings):
    sender = 'monitor@example.com'
    receiver = 'admin@example.com'
    subject = '服务器磁盘空间告警'
    body = '\n'.join(warnings)
    msg = MIMEText(body, 'plain', 'utf-8')
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = receiver
    with smtplib.SMTP('smtp.example.com', 587) as server:
        server.starttls()
        server.login('username', 'password')
        server.send_message(msg)

常见问题与优化建议

1 权限限制

某些容器环境可能没有获取/proc的权限,可通过part.mountpoint跳过系统虚拟文件系统。

2 性能开销

psutil.disk_usage()每次调用会发起系统调用,大量挂载点(>100个)时可考虑缓存结果,降低检测频率。

3 容器环境适配

在Docker容器中,通常只需监控根目录,因为宿主机磁盘对应容器内的只读挂载点需特殊处理。


Q&A问答精选

问:为什么psutil.disk_usage()在Windows下返回的单位不一致?
答:Windows底层使用扇区大小(512字节或4096字节),psutil已统一转换为字节,无需额外处理。

问:监控磁盘inode而不是空间,应该怎么做?
答:psutil.disk_usage()目前不支持inode,Linux下可使用os.statvfs()获取f_filesf_ffree计算inode使用率。

问:如何监控内存和CPU,能否和磁盘监控合并?
答:可以。psutil.virtual_memory()psutil.cpu_percent()很容易集成到同一脚本中,形成统一健康检查。

问:我的脚本执行很快,但crontab没有输出?
答:记得在脚本中明确使用print()logging输出到文件,crontab默认不会自动捕获print,建议重定向:python3 script.py >> monitor.log 2>&1

问:有没有现成的开源项目可以直接用?
答:有,比如glances(监控工具)、Prometheus+node_exporter+Grafana(企业级方案),但本文提供的纯Python方案适合快速集成到现有项目中。


通过以上方案,你可以零成本搭建一套可落地的磁盘监控系统,核心在于:自动化脚本 + 阈值告警 + 可靠的日志记录,这套思路不仅适用于磁盘,同样可以扩展至CPU、内存、网络等系统资源监控。

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