nagios监控硬盘剩余容量

来源:互联网 发布:沙特国王科技大学知乎 编辑:程序博客网 时间:2024/04/30 08:24

查看df源码,会发现它读取是statvfs提供的值,而python本身也有statvfs方法,利用它就可以做一个python版的df了,结合nagios的监控格式要求,把输出格式改下,便可通过nagios实现告警和绘图。
当然,您也可以直接通过os.popen或者subprocess等模块获取df输出的数据,格式化下输出(这样好像暴力了点? XD)。

#!/usr/bin/env python# _*_coding:utf-8_*_"""check disk space"""# $Id$#__author__ = 'warshipJian'__version__ = '$Revision: 0.1 $'import osimport sysimport statvfsdef main():    '''deamon'''    if 'linux' not in sys.platform:        print 'sorry! system opreation not supply!'        sys.exit(3)    mount = []    result = []    label = []    status = 0    with open('/proc/mounts') as f:        for v in f:            v = v.split()            mountName = v[1]            if v[0]  in mount:                continue            mount.append(v[0])            try:                vfs=os.statvfs(mountName)            except OSError:                print 'mounted device error, plase check %s' % mountName                sys.exit(3)            totalSpace= vfs[statvfs.F_BLOCKS]*vfs[statvfs.F_BSIZE]/(1024*1024*1024)            if totalSpace == 0:                continue            availSpace= vfs[statvfs.F_BAVAIL]*vfs[statvfs.F_BSIZE]/(1024*1024*1024)            availInode = vfs[statvfs.F_FFREE]            totalInode = vfs[statvfs.F_FILES]            usedSpace = totalSpace - availSpace            usedInode = totalInode - availInode            usedSpacePer = float(usedSpace)/totalSpace * 100            usedInodePer = float(usedInode)/totalInode * 100            usedSpacePercent = "{0:.0f}%".format(usedSpacePer)            usedInodePercent = "{0:.0f}%".format(usedInodePer)            if usedSpacePer >= 90 or usedInodePer >= 90:                status = 2            elif usedSpacePer >= 80 or usedInodePer >= 80:                status = 1            info = '%s=%sGB,%s inode=%s;' % (mountName,availSpace,usedSpacePercent,usedInodePercent)            if info not in result:                result.append(info)                label.append('%s=%s;%s;%s;0;%s ' % (mountName,availSpace,0,availSpace*2,availSpace*4))    print 'free space:%s|%s' % (''.join(result),''.join(label))    sys.exit(status)if __name__ == '__main__':    main()

参考:
http://blog.csdn.net/yui/article/details/6046708

0 0