使用cron服务,定时跑脚本,监控磁盘容量.

Python脚本监控磁盘使用量,导入Mail模块,超过定值,邮件通知(附上参考脚本)


Python磁盘操作模块

os.statvfs()函数

  • 系统中的df命令应该调用了linux的函数statfs(),这里我使用python,调用的是 os.statvfs()函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
需要的头文件

imprt os #os模块,statvfs函数在此模块中
import statvfs #里面有相应的宏,F_BSIZE等,可以不需要。

vfs=os.statvfs(“目录”)返回这个目录所在磁盘的信息。

F_BSIZE = 0 # 首选block大小 Preferred file system block size

F_FRSIZE = 1 # 基本文件block大小 Fundamental file system block size

F_BLOCKS = 2 #文件系统block总数 Total number of file system blocks (FRSIZE)

F_BFREE = 3 #空闲block数量 Total number of free blocks

F_BAVAIL = 4 # 非超级用户可用的block数量 Free blocks available to non-superuser

F_FILES = 5 # 总的文件节点数量 Total number of file nodes

F_FFREE = 6 #空闲的文件节点的数量 Total number of free file nodes

F_FAVAIL = 7 #非超级用户可用的空闲文件节点数量 Free nodes available to non-superuser

F_FLAG = 8 # Flags (see your local statvfs man page)

F_NAMEMAX = 9 # Maximum file name length
  • 读取有多种方式,比如vfs[0],vfs.f_bsize,vfs[F_BSIZE],都可以读取首选block大小的值。

  • 计算容量就是 block大小*block数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#更改默认除法运算,使得除法计算得到float而不是int

from __future__ import division

#获得磁盘信息

vfs=os.statvfs("目录")

#1k-blocks栏,总容量KB

k_blocks=vfs.f_bsize*vfs.f_blocks/1024

#Used,使用量KB,总容量减去空闲容量

used=vfs.f_bsize*(vfs.f_blocks-vfs.f_bfree)/1024

#Available,有效容量KB

available=vfs.f_bsize*vfs.f_bavail/1024

#use%,使用量,%,round(浮点数,精确到小数点后的位数)

use=round(used/(used+available)*100,2)
为什么use不是由used/k_blocks
  • 看上去,使用量/总容量 就是使用率,但是忽略了一点 总容量=使用量+未使用量+不可使用量

  • 所以其实重点就是在于这个不可使用量,使用率=使用量/(使用量+未使用量) 才是正确的值。


参考脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python
import os

def disk_stat():
hd = {}
disk = os.statvfs("/var/lib/test")
disk1 = os.statvfs("/")

disksize = disk.f_bsize * disk.f_blocks/(1024*1024*1024)
used = disk.f_bsize * (disk.f_blocks - disk.f_bfree) / (1024 ** 3)
hd['diskused'] = format((used / float(disksize)), '.2f')

disksize1 = disk1.f_bsize * disk1.f_blocks/(1024*1024*1024)
used1 = disk1.f_bsize * (disk1.f_blocks - disk1.f_bfree) / (1024 ** 3)
hd['diskused1'] = format((used1 / float(disksize1)), '.2f')

#return used, disksize, diskused, used1, disksize1, diskused1
return hd


def Email():
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import datetime

user = '[email protected]'
pwd = 'test'
to = ['[email protected]']
msg = MIMEMultipart()
msg['Subject'] = 'disk Exceed the limit, Please Process'
msg['From'] = user
msg['To'] = ','.join(to)

part = MIMEText('test disk Exceed the limit, Please Process')
msg.attach(part)


server = smtplib.SMTP('smtp.test.com')
server.login(user, pwd)
server.sendmail(user, to, msg.as_string())
server.close()

if __name__ == '__main__':
hd = disk_stat()
if hd['diskused'] > 0.75 or hd['diskused1'] > 0.75:
Email()