系统性能信息模块psutil
1.pip安装,安装第三方模块出现问题:
#无法安装psutil
yum install python-devel.x86_64
yum install gcc
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com psutil
2.源码安装地址https://pypi.python.org,搜索psutil
获取系统性能信息
(1)CPU信息
linuxCPU利用率分为:
import psutil
psutil.cpu_times()#获取cpu完整信息,percpu=True逻辑cpu
psutil.cpu_times().user#User Time,用户cpu时间比
38.0
psutil.cpu_count()#cpu逻辑个数
psutil.cpu_count(logical=False)#cpu物理个数
(2)内存信息
total(内存总数),used(已使用),free(空闲),buffers(缓冲使用数),cache(缓存使用数)
psutil.virtual_memory()#完整内存信息
psutil.swap_memory()#获取swap分区信息
import psutil
mem = psutil.virtial_memory()
mem.total
mem.free
psutil.swap_memory()
(3)磁盘信息
磁盘利用率:psutil.disk_usage()
IO信息:psutil.disk_io_counters()
read_count,write_count—读写IO数
read_bytes,write_bytes—IO读写字节数
read_time,write_time—磁盘读写时间
psutil.disk_partitions()#完整磁盘信息
psutil.disk_usage('/')#此分区的磁盘使用情况
psutil.disk_io_counters()#硬盘总的IO个数和读写信息
psutil.disk_io_counters(perdisk=True)#获取每个磁盘更详细信息
(4)网络信息
psutil.net_io_counters()
bytes_sent=,bytes_recv=—发送接收字节数
packets_sent=,packets_recv=—发送接收数据包数
psutil.net_io_counters()
(5)其他系统信息
#当前登录的用户信息
psutils.users()
#开机时间,时间戳转化为时间
temp = psutil.boot_time()
import datetime
datetime.datetime.fromtimestamp(temp)
系统进程管理方法
(1)进程信息
psutil.pids()—所有进程PID
psutil.Process()—获取单个进程名称,路径,状态,系统资源利用率等
psutil.pids()
p = psutil.Process(2424)
p.name()#进程名
p.exe()#路径
p.status()#状态
p.create_time()
p.uids()#使用用户
p.gids()#使用用户组
p.cpu_times()
p.memory_percent()#内存利用率
p.io_counters()#IO读写和字节数
p.connections()#打开socker的namedutples列表
p.num_threads()#开启的线程数
(2)popen类的使用
获取用户启动的应用程序的进程信息
popen启动方法可以跟踪应用程序信息
from subprocess import PIPE
p = psutil.Popen(["/usr/bin/python3","-c","print('hello')"],stdout=PIPE)
p.name()
p.username()
p.communicate()
p.cpu_times()
实用的IP地址处理模块IPy
安装方式:pip安装
IP地址、网段的基本处理
from IP import IPy
IP('10.0.0.0/8').version()
4 #ipv4
IP('::1').version()
6 #ipv6
#输出该网段的IP个数和所有IP地址
ip = IP('192.168.0.0/16')
len(ip)
for x in ip:print(x)
ip1 = IP('192.168.1.20')
ip1.reverseNames()#反向解析地址格式
ip1.iptype()#PRIVATE
ip2 = IP('8.8.8.8')
ip2.iptype()#PUBLIC
ip2.int()
ip2.strHex()#16进制
ip2.strBin()#2进制
IP与子网掩码转化成同样的格式
IP('192.168.1.0').make_net('255.255.255.0')
IP('192.168.1.0/255.255.255.0',make_net=True)
IP('192.168.1.0-192.168.1.255',make_net=True)
IP('192.168.1.0/24')
IP与子网掩码转化成不同的格式
wantprefixlen取值0,1,2,3。
ip = IP('192.168.1.0/24')
ip.strNormal(0)#无返回
'192.168.1.0'
ip.strNormal(1)#prefix格式
'192.168.1.0/24'
ip.strNormal(2)#decimalnetmask格式
'192.168.1.0/255.255.255.0'
ip.strNormal(3)#lastIP格式
'192.168.1.0-192.168.1.255'
多网络计算方法详解
即使prefixlen相同:10.0.0.0/16 192.0.0.0/16 不相同
即使prefixlen不相同:10.0.0.0/16 与 10.0.0.0/24不相同
大小比较
IP('10.0.0.0/24')<IP('12.0.0.0/24')
是否包含于另一个网段中
'192.168.1.100' in IP('192.168.1.0/24')
True
IP('192.168.1.0/24') in IP('192.168.0.0/16')
True
是否重叠overlaps()
IP('192.168.0.0/23').overlaps('192.168.1.0/24')
1
IP('192.168.1.0/24').overlaps('192.168.2.0')
0
实例:根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数、IP类型等信息.
# coding: utf-8
from IPy import IP
ip_s = input('Please input an IP or net-range: ')
ips = IP(ip_s)
ips
if len(ips) > 1:
print('net: %s'% ips.net())
print('netmask: %s'% ips.netmask())
print('broadcast: %s' % ips.broadcast())
if len(ips) > 1:
print('net: %s'% ips.net())
print('netmask: %s'% ips.netmask())
print('broadcast: %s' % ips.broadcast())
print('reverse address: %s' % reverseNames()[0])
print('subnet: %s' % len(ips))
else:
print('reverse address: %s' % ips.reverseNames()[0])
print('hexDecimal: %s' % ips.strHex())
print('binary ip: %s' % ips.strBin())
print('iptype: %s' % ips.iptype())
DNS处理模块dnspython
安装方式:pip安装
模块域名解析方法详解
dnspython模块提供了大量的DNS处理方法,最常用的方法是域名查询。
dnspython提供了一个DNS解析器类–resolver,使用它的query方法来实现域名的查询功能。
query方法的定义如下:
query(self,qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True,sorce_port=0)
其中qname参数为查询的域名。
rdtype参数用来指定RR资源的类型,常用的有:
常见解析类型实例说明
dns.resolver.query方法可以简单实现这些DNS类型的查询。
(1)A记录
作用: 将字典类型转换为可遍历的元组
用法: dict.items()
for key,values in dict.items():print(key,values)
#simple1.py
import dns.resolver
domain = 'www.baidu.com'#输入一个域名
A = dns.resolver.query(domain,'A')
for i in A.response.answer:#返回的i=www.baidu.com 393 IN CNAME www.a.shifen.com
for j in i.items:#取出dict的键
print(j)
#j.address错误
(2)MX记录查询(eg:baidu.com)
#simple2.py
import dns.resolver
domain = 'baidu.com'
MX = dns.resolver.query(domain, 'MX')
for i in MX:#返回的i==20 jpmx.baidu.com
print(i)
#i.exchange错误
(3)NS记录查询
#simple3.py
import dns.resolver
domain = '163.com'
ns = dns.resolver.query(domain, 'NS')
for i in ns.response.answer:
for j in i.items:
print j.to_text()
(4)CNAME记录查询
#simple4.py
import dns.resolver
domain = 'www.baidu.com'
cname = dns.resolver.query(domain, 'CNAME')
for i in cname.response.answer:
for j in i.items:
print j.to_text()
DNS域名轮询业务监控
import dns.resolver
import os
import httplib2
iplist=[] #定义域名IP列表变量
appdomain="www.baidu.com" #定义业务域名
def get_iplist(domain=""): #域名解析函数,解析成功IP将追加到iplist
try:
A = dns.resolver.query(domain, 'A') #解析A记录类型
except Exception as e:
print "dns resolver error:"+str(e)
return
for i in A.response.answer:
for j in i.items:
iplist.append(j.address) #address错误
return True
def checkip(ip):
checkurl=ip+":80"
getcontent=""
httplib2.socket.setdefaulttimeout(5) #定义http连接超时时间(5秒)
conn=httplib2.HTTPConnection(checkurl) #创建http连接对象
try:
conn.request("GET", "/",headers = {"Host": appdomain}) #发起URL请求,添加host主机头
r=conn.getresponse()
getcontent =r.read(15) #获取URL页面前15个字符,以便做可用性校验
finally:
if getcontent=="": #监控URL页的内容一般是事先定义好,比如“HTTP200”等
print ip+" [OK]"
else:
print ip+" [Error]" #此处可放告警程序,可以是邮件、短信通知
if __name__=="__main__":
if get_iplist(appdomain) and len(iplist)>0: #条件:域名解析正确且至少要返回一个IP
for ip in iplist:
checkip(ip)#检查IP是否正常
else:
print "dns resolver error."