Python磁盘监控实战:如何高效监控磁盘空间并自动预警
📚 目录导读
- 为什么需要磁盘监控?
磁盘满溢的常见场景与后果

- 核心原理:Python如何获取磁盘信息
跨平台方案对比(psutil vs os.statvfs)
- 完整代码实现:从检测到预警
- 基础版:单磁盘空间检查
- 进阶版:多磁盘、阈值配置与日志记录
- 自动化执行:结合定时任务与邮件告警
使用crontab / Windows任务计划实现定时检测
- 常见问题与优化建议
权限问题、性能开销、容器环境适配
- 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_files和f_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、内存、网络等系统资源监控。