《Python自动化运维之路》 系统基础信息模块(一)

系统性能收集模块Psutil

目录:

  • 系统性能信息模块psutil

系统性能信息模块psutil

psutil能够轻松实现获取系统运行的进程和系统利用率包括(CPU,内存,磁盘 和网络)等。主要用于系统监控。对于系统维护来说是个不错的模块。

1.模块的安装

wget https://files.pythonhosted.org/packages/14/a2/8ac7dda36eac03950ec2668ab1b466314403031c83a95c5efc81d2acf163/psutil-5.4.5.tar.gz

yum install -y gcc readline-devel* zlib*
tar -xzvf psutil-5.4.5.tar.gz
cd psutil-5.4.5
python setup.py install

获取系统性能信息

(1)获取CPU信息

Linux操作系统的CPU利用率有以下几个部分:

  • User Time    #执行用户进程的时间百分比
  • System Time  #执行内核进程和总段的时间百分比
  • Wait IO        #由于IO等待而使CPU处于idle(空闲状态的时间百分比)
  • Idle                    #CPU处于Idle状态的时间百分比

实例:

#使用psutil.cpu_times()函数取出CPU简要信息,如需要完整信息使用psutil.cpu_times(True)即可

>>> import psutil
>>>
>>> psutil.cpu_times()
scputimes(user=52745.65625, system=26600.859375, idle=384777.265625, interrupt=1410.8125, dpc=1468.984375)
>>> psutil.cpu_times(True)
[scputimes(user=12148.0, system=7542.421875, idle=96366.203125, interrupt=1105.546875, dpc=1091.84375), scputimes(user=13037.046875, system=6173.28125, idle=96845.85937499999, interrupt=137.734375, dpc=151.171875), scputimes(user=13006.953125, system=6257.390625, idle=96791.84374999999, interrupt=87.5, dpc=137.671875), scputimes(user=14555.515624999998, system=6629.703124999985, idle=94870.9375, interrupt=80.0625, dpc=88.4375)]
>>> 

#获取单项数据信息,如以下获取user的CPU时间比

>>> psutil.cpu_times().user
52766.546875
>>> 

#获取CPU逻辑个数,默认logical=True4

>>> psutil.cpu_count()
4
>>> 

#获取CPU物理个数

>>> psutil.cpu_count(logical=False)
4
>>> 

(2)获取内存信息

Linux操作系统对内存的统计有以下几个部分:

  • Total             #内存总数
  • User               #已使用内存
  • Free            #空闲内存数
  • Buffers             #缓冲使用数
  • Cache              #缓存使用数
  • Swap               #交换分区

实例:

#获取内存完整信息

>>> import psutil
>>>
>>> mem=psutil.virtual_memory()
>>>
>>> mem                   #获取到的内存数据
svmem(total=8457035776, available=5508038656, percent=34.9, used=2948997120, free=5508038656)
>>>
>>> mem.total             #获取内存总数
8457035776
>>>
>>> mem.free              #获取内存剩余
5508038656
>>>
>>> psutil.swap_memory()  #获取swap交换内存
sswap(total=9799213056, used=3736629248, free=6062583808, percent=38.1, sin=0, sout=0)
>>>
>>> 

(3)获取磁盘信息

  • Read_count     #读IO数
  • Write_count     #写IO数
  • Read_byte       #IO读字节数
  • Write_byte        #IO写字节数
  • Read_time        #磁盘读时间
  • Write_time        #磁盘写时间

实例:

>>> import psutil
>>>
>>> psutil.disk_partitions()                #获取当前磁盘完整信息
[sdiskpart(device=‘C:\\‘, mountpoint=‘C:\\‘, fstype=‘NTFS‘, opts=‘rw,fixed‘), sdiskpart(device=‘D:\\‘, mountpoint=‘D:\\‘, fstype=‘NTFS‘, opts=‘rw,fixed‘)]
>>>
>>> psutil.disk_usage("C:\\")               #获取指定分区(参数)的使用情况
sdiskusage(total=115865546752, used=31459299328, free=84406247424, percent=27.2)
>>> >>>
>>> psutil.disk_io_counters()                #获取硬盘总的IO个数,与读写信息
sdiskio(read_count=1577844, write_count=1529528, read_bytes=71110199808, write_bytes=103924939776, read_time=6624, write_time=8764)
>>>
>>> psutil.disk_io_counters(perdisk=True)     #获取单个分区IO个数,与读写信息
{‘PhysicalDrive0‘: sdiskio(read_count=837428, write_count=944450, read_bytes=37869357056, write_bytes=32956311040, read_time=1928, write_time=2476), ‘PhysicalDrive1‘: sdiskio(read_count=740416, write_count=585185, read_bytes=33240842752, write_bytes=70969325056, read_time=4696, write_time=6288)}
>>>
>>> 

(4)获取网络信息

  • Bytes_sent       #发送字节数
  • Bytes_recv       #接收字节数
  • Packets_sent   #发送数据包
  • Packets_recv    #接收数据包

实例:

>>> import psutil
>>>
>>> psutil.net_io_counters()           #获取网络IO信息,默认pernic=False
snetio(bytes_sent=1137465964, bytes_recv=1533965380, packets_sent=18466211, packets_recv=4429783, errin=0, errout=0, dropin=0, dropout=0)
>>>
>>> psutil.net_io_counters(pernic=True) #输出每个网络接口的IO信息
{‘eth0‘: snetio(bytes_sent=1137468550, bytes_recv=1533958095, packets_sent=18466313, packets_recv=4429706, errin=0, errout=0, dropin=0, dropout=0), ‘lo‘: snetio(bytes_sent=33796, bytes_recv=33796, packets_sent=455, packets_recv=455, errin=0, errout=0, dropin=0, dropout=0)}
>>> 

(5)其他系统信息

实例:

>>> import psutil
>>>
>>> psutil.users()                #返回当前登录系统用户信息
[suser(name=‘root‘, terminal=‘pts/0‘, host=‘27.201.232.42‘, started=1528273152.0, pid=18905)]
>>>
>>> import psutil,datetime
>>>
>>> psutil.boot_time()             #获取开启时间
1527585242.0
>>>
>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
‘2018-05-29 17:14:02‘              #获取开机时间,以linux时间戳显示
>>> 

系统进程管理方法

常用方法:

  • psutil.pids()                      #列出所有进程PID
  • psutil.Process(2714)        #实例化
  • p.name()                            #取进程名
  • p.exe()                               #取bin路径
  • p.cwd()                              #进程工作目录绝对路径
  • p.status()                          #进程状态
  • p.create_time()                 #进程创建时间,时间戳格式
  • p.uids()                             #取进程UID信息
  • p.gids()                             #取进程GID信息
  • p.cpu_times()                   #进程CPU时间信息,包括user,system两个CPU时间
  • p.cpu_affinity()                #get进程CPU亲和度,如果设置进程CPU亲和度将CPU号作为参数即可
  • p.memory_percent()        #取进程利用率
  • p.memory_info()              #进程内存rss.vms信息
  • p.io_counters()                #进程IO信息,包括读写IO数及字节数
  • p.connections()               #返回打开进程socket的namedutples列表,包括fs.family.laddr等信息
  • p.num_threads()              #进程开启的线程数

实例:

>>> import psutil
>>>
>>> psutil.pids()                      #列出所有进程号
[0, 4, 360, 544, 636, 708, 716, 808, 880, 304, 384, 1028, 1120, 1236, 1420, 1480, 1688, 1788, 1900, 1956, 1848, 2064]
>>>
>>> p=psutil.Process(1956)             #实例化一个Process对象,参数为一进程PID
>>>
>>> p.name()                           #取进程名字
‘RtkAudioService64.exe‘
>>>
>>>
>>> p.num_threads()                    #取进程线程数
4
>>> 

IP地址处理模块IPy

作用:计算大量的IP地址,包括网段,网络掩码,广播地址,子网个数,IP类型等。可以很好的辅助我们高效完成IP地址的规划工作。

1:IP地址与网段的基本处理

#辨别IPv4与IPv6

>>> import IPy
>>> from IPy import IP
>>>
>>> IP("192.168.0.0/24").version()       #判断类型为IPv4
4
>>>
>>> IP("::1").version()                  #判断类型为IPv6
6
>>> 

#通过指定网段输出该网段的IP个数以及所有IP地址清单

>>> import IPy
>>> from IPy import IP
>>>
>>> ip_address=IP("192.168.1.0/24")       #指定IP地址范围
>>>
>>> print(ip_address.len())               #输出该网段的IP个数
256
>>>
>>> for i in ip_address:                  #输出该网段的所有IP清单
...     print(i)
...
192.168.1.0
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
........

#IP地址的反向解析名称,IP类型与转换

>>> import IPy
>>> from IPy import IP
>>>
>>> ip_address=IP("192.168.1.10")
>>>
>>> ip_address.reverseNames()              #输出反向解析地址格式
[‘10.1.168.192.in-addr.arpa.‘]
>>>
>>> ip_address.iptype()                    #查看IP类型,此处为私网类型
‘PRIVATE‘
>>>
>>> IP("8.8.8.8").iptype()                 #查看IP类型,此处为公网类型
‘PUBLIC‘
>>>
>>>
>>> IP("8.8.8.8").int()                    #转换成整形格式
134744072
>>>
>>> IP("8.8.8.8").strHex()                 #转换成十六进制格式
‘0x8080808‘
>>>
>>> IP("8.8.8.8").strBin()                 #转换成二进制格式
‘00001000000010000000100000001000‘
>>>
>>> print(IP(0x8080808))                   #十六进制转换成IP格式
8.8.8.8
>>> 

#根据IP与子网掩码生成网段格式

>>> import IPy
>>> from IPy import IP
>>>
>>> IP("192.168.1.0").make_net("255.255.255.0")
IP(‘192.168.1.0/24‘)
>>>
>>> IP("192.168.1.0/255.255.255.0",make_net=True)
IP(‘192.168.1.0/24‘)
>>>
>>> IP("192.168.1.0-192.168.1.255",make_net=True)
IP(‘192.168.1.0/24‘)

#通过strNormal方法指定不同wantprefixlen参数值,定制输出不同类型的网段

>>> import IPy
>>> from IPy import IP
>>>
>>> IP("192.168.1.0/24").strNormal(0)
‘192.168.1.0‘
>>>
>>> IP("192.168.1.0/24").strNormal(1)
‘192.168.1.0/24‘
>>>
>>> IP("192.168.1.0/24").strNormal(2)
‘192.168.1.0/255.255.255.0‘
>>>
>>> IP("192.168.1.0/24").strNormal(3)
‘192.168.1.0-192.168.1.255‘
>>> 

wantprefixlen取值范围:

  • wantprefixlen=0         #无返回值,如192.168.1.0;
  • wantprefixlen=1         #perfix格式,如192.168.1.0/2;
  • wantprefixlen=2         #decimalnetmask格式,如192.168.1.0/255.255.255.0;
  • wantprefixlen=3         #lastIP格式,如192.168.1.0-192.168.1.255

2:多网络的计算比对方法

作用:用于比对两个网段是否存在,包含,重叠等关系

#进行数据比对,判断两个网段是否相等(或者说是否在同一个广播域)

>>> import IPy
>>> from IPy import IP
>>>
>>> IP("10.0.0.0/24") < IP("20.0.0.0/24")
True

#判断IP地址和网段是否包含于另一个网段中

>>> import IPy
>>> from IPy import IP
>>>
>>> "192.168.1.10" in IP("192.168.1.0/24")         #1.10是否在0/24这个网段中
True
>>>
>>> IP("192.168.1.0/24") in IP("192.168.0.0/16")   #前面的与后面的是否有交叉
True
>>> 

#判断两个网段是否有重叠,采用IPy提供的overlaps方法

>>> import IPy
>>> from IPy import IP
>>>
>>> IP("192.168.0.0/23").overlaps("192.168.1.0/24")     #返回1代表存在重叠
1
>>>
>>> IP("192.168.1.0/24").overlaps("192.168.2.0")        #返回0代表不存在重叠
0
>>> 

#输入IP或子网,返回网络,掩码,广播,反向解析,子网个数,IP类型等信息

import IPy
from IPy import IP

ip_s =input("输入IP地址或网段地址:")             #例如:192.168.1.0/24

ips=IP(ip_s)

if len(ips) > 1:                               #为一个网络地址时执行

    print("网络地址:%s" %ips.net())
    print("子网掩码:%s" %ips.netmask())
    print("广播地址:%s" %ips.broadcast())
    print("反向解析:%s" %ips.reverseNames()[0])
    print("网络子网数:%s" %len(ips))

else:                                           #为单个IP时执行

    print("反向解析:%s" %ips.reverseNames()[0])
    print("十六进制地址:%s" %ips.strHex())
    print("二进制地址:%s" %ips.strBin())
    print("地址类型:%s" %sips.iptype())

DNS处理模块dnspython

目录:

  • 利用模块解析域名的方法
  • 常见的解析类型实例
  • 实践:DNS域名轮询业务监控

简介:

dnspython是python实现的一个DNS工具包,它支持几乎所有的记录类型,可用于查询,传输并动态更新ZONE信息,同时支持TSIG(事务签名),验证消息和EDNS0(扩展DNS)。

dnspython模块安装

利用模块解析域名的方法

 #实现A记录的查询方法

import dns.resolver

domain=input("输入一个域名:")          #输入域名,例如:www.baidu.com

A=dns.resolver.query(domain,"A")     #指定查询A记录

for i in A.response.answer:          #通过response.answer方法获取查询回应信息
    for j in i.items:                #遍历回应信息
        print(j)

原文地址:https://www.cnblogs.com/LyShark/p/9145347.html

时间: 2024-10-16 00:22:24

《Python自动化运维之路》 系统基础信息模块(一)的相关文章

python自动化运维之路~DAY7

python自动化运维之路~DAY7 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.客户端/服务器架构 C/S 架构是一种典型的两层架构,其全称是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据:另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信. C/S 架构也可以看做是胖客户端架构.因为客户端需要实现绝大多数的业务

python自动化运维之路~DAY10

python自动化运维之路~DAY10 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

【Python自动化运维之路Day7】基础篇

今日目录: 模块 configparser xml shutil zipfile tarfile subprocess 面向对象(上) 一. 模块 上一期博客里列出了几个常用模块(os,hashlib,sys,re), 还有几个剩余的,这篇来继续往下走. 1. configparser模块 configparser模块是Python自带模块,主要用于处理特定的文件(ini文件),格式比较像MySQL的配置文件类型,就是文件中有多个section,每个section下面有多个配置项,如下: [my

【Python自动化运维之路Day5】基础篇

今日目录: 多层装饰器 字符串格式化 生成器和迭代器 递归 模块 一. 多层装饰器 还是上一篇的那个例子,关于用户管理程序:登录用户管理程序,查看用户信息的时候,系统要提示登录,登录验证成功后普通用户可以查看自己信息,管理员登录后才可以进入管理界面,普通用户提示权限不足,这样一来,就可以重新写下程序,来两个装饰器来装饰: #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Author: DBQ(Du Baoqiang) #先定义一个用户字典,判断用

【Python自动化运维之路Day8】基础篇之面向对象下篇

今日目录: 类成员 成员修饰符 特殊的类成员 面向对象相关联的其他知识 异常捕获与处理 设计模式之单例模式 一. 类成员 类的成员有:字段.方法和属性 关系图如下: 1. 字段: 字段分: 静态字段 普通字段 两者在定义和使用上有所区别,如下代码: class Province: contry = '中国' #静态字段,保存在类中 def __init__(self,name): self.name = name #普通字段,保存在对象中 在内存中的存储位置是不同的, 静态字段保存在类中, 而普

【Python自动化运维之路Day9】Socket

socket也可以认为是套接字是一种源IP地址和目的IP地址以及源端口号和目的端口号的组合.网络化的应用程序在开始任何通讯之前都必须要创建套接字.就像电话的插口一样,没有它就没办法通讯. socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) 我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我

python自动化运维之路4

装饰器 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 装饰器的应用场景:饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大

【Python自动化运维之路Day2】

1. 常量命名规则 在Python中,会在变量命名上标明某变量是常量,通常采用全是大写的方式来标明,如: CONNECT= '127.0.0.1' PORT = '3306' 2.Python编译 python先把源码文件(.py)编译成字节码文件(.pyc) python3执行后,生成了一个__pycache__目录,pyc会在此目录下,python2执行可以看到直接生成了一个.pyc文件 pyc  与py  时间戳不同,pyc才去重新编译 3  数据 <1> str 1.str1+str2

python自动化运维之路~DAY1

刚学python,有大神给指点指点的吗? #!/usr/bin/env python#_*_coding:utf8_*_import getpass,syscount = 0match_info = False #用布尔值来标志用户密码是否匹配,默认是flasewhile count < 3: username = input("\033[32;1mAsk you for a username :\033[0m") with open("locked.txt"