“Python系统信息监控”的版本间的差异
来自CloudWiki
(→获取网络读写字节个数) |
|||
第184行: | 第184行: | ||
print("网络接口信息",psutil.net_if_addrs()) | print("网络接口信息",psutil.net_if_addrs()) | ||
print("网络接口状态",psutil.net_if_stats())</nowiki> | print("网络接口状态",psutil.net_if_stats())</nowiki> | ||
+ | |||
+ | ==应用:使用python函数持续监控系统状态== | ||
+ | |||
+ | <nowiki> | ||
+ | import time #导入time模块 | ||
+ | import psutil #导入psutil模块 | ||
+ | def func(): | ||
+ | while True: # -------》持续监控得while循环 | ||
+ | mem = psutil.virtual_memory() #----》监控物理内存 | ||
+ | disk = psutil.disk_usage(r'c:') #----》监控硬盘 | ||
+ | cpu = psutil.cpu_percent(1) #-----》cpu使用率监控 | ||
+ | if cpu > 10: | ||
+ | print('你的cpu顶不住了,已经使用了%s'%cpu) # 使用占位符 | ||
+ | |||
+ | else: | ||
+ | print('你的cpu情况还行噢,已经使用了%s'%cpu) | ||
+ | if mem[2] > 70: | ||
+ | print('你的物理内存顶不住了,占用率为%s'%mem[2]) | ||
+ | else: | ||
+ | print('你的内存情况还行噢,占用率为%s'%mem[2]) | ||
+ | if disk[3] > 70: | ||
+ | print('你的C盘里放了多少资源啊,使用率高达%s'%disk[3]) | ||
+ | else: | ||
+ | print('C盘里东西不多,占用了%s'%disk[3]) | ||
+ | time.sleep(3) #----》睡三秒 | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | func()</nowiki> | ||
+ | |||
+ | ==应用:使用邮件模块对系统信息进行报警(未验证)== | ||
+ | <nowiki> | ||
+ | #连接邮箱服务器 | ||
+ | 2 import yagmail #请先下载yagmail包,再导入 | ||
+ | 3 import psutil #导入psutil模块 | ||
+ | 4 def mail(subject,contents): ---》形参为邮件的标题和内容 | ||
+ | 5 yag = yagmail.SMTP(user='z1065132644@163.com', password='yn369369', host='smtp.163.com') passwd为授权的密码不是登陆密码 | ||
+ | 6 #发送邮件 | ||
+ | 7 yag.send(to='z1065132644@163.com',subject=subject, contents=contents) ————》定义变量subject和contents | ||
+ | 8 #断开连接 | ||
+ | 9 yag.close() | ||
+ | 10 | ||
+ | 11 # import psutil | ||
+ | 12 def cpu_info(): ----》函数名尽可能切合内容 | ||
+ | 13 cpu = psutil.cpu_percent(1) | ||
+ | 14 return cpu ----》返回cpu,可以被调用,此return的结果就是调用的结果 | ||
+ | 15 res=cpu_info() ----》给调用结果赋值。可以省略,下同 | ||
+ | 16 | ||
+ | 17 def mem_info(): | ||
+ | 18 mem = psutil.virtual_memory() ---》通过ps模块输出内存情况 | ||
+ | 19 info1={'mem_total':mem[0],'mem_free':mem[1],'mem_percent':mem[2],'mem_used':mem[3]} --》将内存情况放入一个字典,方便调用 | ||
+ | 20 return info1 | ||
+ | 21 res2=mem_info() | ||
+ | 22 | ||
+ | 23 def disk_info(): | ||
+ | 24 disk = psutil.disk_usage(r'c:') ---》(r'c:')为查看盘的固定写法 | ||
+ | 25 info2 = {'total': disk[0], 'used': disk[1], 'free': disk[2], 'percent': disk[3]} ---》同样写入一个字典 | ||
+ | 26 return info2 | ||
+ | 27 res3=disk_info() | ||
+ | 28 | ||
+ | 29 def main(): ----->定义一个主函数 | ||
+ | 30 m_cpu = res | ||
+ | 31 m_mem = res2 | ||
+ | 32 m_disk = res3 --->将各个分函数的调用结果当作函数体输入 | ||
+ | 33 msg=''' ---》赋值msg整个的监控情况,cpu,内存和磁盘使用等 | ||
+ | 34 cpu使用率%s | ||
+ | 35 内存总量%sM ---》使用占位符,单位,注意%%为一个百分比的固定写法 | ||
+ | 36 内存剩余%sM | ||
+ | 37 内存使用率%s | ||
+ | 38 内存使用量%sM | ||
+ | 39 磁盘总量%sGB | ||
+ | 40 磁盘使用量%sGB | ||
+ | 41 磁盘剩余量%sGB | ||
+ | 42 磁盘使用率%s%% | ||
+ | 43 '''\ ---》 换行用 \ | ||
+ | 44 %(m_cpu,int(m_mem.get('mem_total')/1024/1024),int(m_mem['mem_free']/1024/1024),m_mem['mem_percent'], | ||
+ | int(m_mem['mem_used']/1024/1024),int(m_disk['total']/1024/1024/1024),int(m_disk['used']/1024/1024/1024), | ||
+ | int(m_disk['free']/1024/1024/1024),m_disk['percent']) --》int()取整数 | ||
+ | 46 print(msg) ---》输出整个情况 | ||
+ | 47 if m_cpu >50: ---》设置报警值,下同 | ||
+ | 48 mail('cpu报警',msg) ---》给分函数mail的形参传参 | ||
+ | 49 else: | ||
+ | 50 print('cpu正常') | ||
+ | 51 if m_mem['mem_percent'] > 50: | ||
+ | 52 print('悠着点,内存占用过半了') | ||
+ | 53 else: | ||
+ | 54 print('relax') | ||
+ | 55 if m_disk['percent'] > 50: | ||
+ | 56 print('悠着点,磁盘快炸了') | ||
+ | 57 else: | ||
+ | 58 print('放轻松,没事哦') | ||
+ | 59 | ||
+ | 60 if __name__=='__main__': --》主函数调用固定格式 | ||
+ | 61 main()</nowiki> | ||
+ | |||
==拓展== | ==拓展== |
2021年4月11日 (日) 15:08的版本
目录
概述
用Python来编写脚本简化日常的运维工作是Python的一个重要用途。在Linux下,有许多系统命令可以让我们时刻监控系统运行的状态,如ps,top,free等等。要获取这些系统信息,Python可以通过subprocess模块调用并获取结果。但这样做显得很麻烦,尤其是要写很多解析代码。
在Python中获取系统信息的另一个好办法是使用psutil这个第三方模块。顾名思义,psutil = process and system utilities,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理员和运维小伙伴不可或缺的必备模块。
安装方法如下:
pip3 install psutil
如果生产环境没有联网则可以先在外网使用pip下载,再移动至生产环境安装。为了方便显示语句运行结果,下面使用IPython解释器。在此啰嗦一下,IPython是学习Python的利器,是让Python显得友好十倍的外套,强烈建议读者使用IPython, 可通过以下命令安装IPython
pip3 install ipython。
下面一一列举使用方法。
获取CPU信息
获取CPU个数
>>> import psutil >>> psutil.cpu_count() 8 >>> psutil.cpu_count(logical=False) 4
统计CPU的用户/系统/空闲时间
>>> psutil.cpu_times() scputimes(user=192222.59374999997, system=147996.34375, idle=3147198.015625, interrupt=11456.46875, dpc=4403.546875)
>>> psutil.cpu_times(percpu=True) [scputimes(user=30696.484375, system=27652.09375, idle=377724.46875, interrupt=7768.828125, dpc=3813.765625), scputimes(user=13698.046875, system=13368.046874999942, idle=409006.734375, interrupt=483.59375, dpc=96.59375), scputimes(user=31968.859374999996, system=20170.640625, idle=383933.328125, interrupt=517.78125, dpc=127.28125), scputimes(user=13582.359375, system=11269.468749999942, idle=411221.0, interrupt=380.75, dpc=35.828125), scputimes(user=32777.03125, system=22783.03124999994, idle=380512.75, interrupt=822.765625, dpc=154.84375), scputimes(user=17815.59375, system=13164.203125, idle=405093.03125, interrupt=448.78125, dpc=32.203125), scputimes(user=25047.562499999996, system=19983.265625, idle=391041.99999999994, interrupt=631.328125, dpc=105.15625), scputimes(user=26672.28125, system=19648.5625, idle=389751.984375, interrupt=405.265625, dpc=39.0625)]
获取CPU占用率
>>> psutil.cpu_percent() 7.1 >>> psutil.cpu_percent(percpu=True) [8.9, 3.0, 8.9, 4.3, 8.7, 4.8, 8.8, 9.0]
实例:
import psutil for x in range(10): s=psutil.cpu_percent(interval=1) print("当前cput占比为:",s)
监控内存信息
查看物理内存
>>> psutil.virtual_memory() svmem(total=8278306816, available=954941440, percent=88.5, used=7323365376, free=954941440)
查看交换内存
>>> psutil.swap_memory() sswap(total=20787396608, used=17976201216, free=2811195392, percent=86.5, sin=0, sout=0)
实例:
>>> mem = psutil.virtual_memory() >>> mem.total 8278306816 >>> mem.used 7043653632 >>> mem.free 1234653184 >>> type(mem.free) <class 'int'> >>> if mem.used/mem.total >0.8 : print("内存占用过高!") else: print("内存占比正常。")
思考:内存的利用率应该怎样计算?
监控磁盘信息
查看磁盘分区
>>> psutil.disk_partitions() [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='E:\\', mountpoint='E:\\', fstype='exFAT', opts='rw,fixed')]
磁盘利用率
磁盘利用率 要在参数上指定路径:
>>> psutil.disk_usage('C:\\') sdiskusage(total=107374178304, used=62052282368, free=45321895936, percent=57.8) >>> psutil.disk_usage('D:\\') sdiskusage(total=403391377408, used=8059502592, free=395331874816, percent=2.0)
磁盘IO数
查看总IO数:
>>> psutil.disk_io_counters() sdiskio(read_count=12433626, write_count=19244946, read_bytes=606192376832, write_bytes=564326417920, read_time=5281, write_time=4576) >>> psutil.disk_io_counters().read_count 12441178
查看每个磁盘IO数:
>>> psutil.disk_io_counters(perdisk=True) {'PhysicalDrive0': sdiskio(read_count=12432860, write_count=19245033, read_bytes=606186330112, write_bytes=564327729664, read_time=5216, write_time=4576), 'PhysicalDrive1': sdiskio(read_count=797, write_count=28, read_bytes=6743040, write_bytes=638976, read_time=65, write_time=0)} >>> s=psutil.disk_io_counters(perdisk=True) >>> s['PhysicalDrive0'] sdiskio(read_count=12440387, write_count=19248016, read_bytes=606235895808, write_bytes=564359970816, read_time=5216, write_time=4578) >>> s['PhysicalDrive0'].read_count 12440387
监控网络信息
获得本机IP
>>> import socket >>> hostname = socket.gethostname() >>> hostname 'LAPTOP-28C3GCM7' >>> socket.gethostbyname(hostname) '192.168.1.104'
获取网络读写字节个数
psutil.net_io_counters()#获取网络读写字节的个数 snetio(bytes_sent=8445215479, bytes_recv=7761730094, packets_sent=5203357, packets_recv=10378093, errin=0, errout=0, dropin=0, dropout=0)
思考:从中能获得什么信息 ?
获取网络接口信息
>>> psutil.net_if_addrs() {'本地连接* 1': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='E8-6F-38-26-0F-C9', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.77.128', netmask='255.255.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::f05e:828a:d017:4d80', netmask=None, broadcast=None, ptp=None)],
获取网络接口状态
>>> psutil.net_if_stats() {'蓝牙网络连接': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=3, mtu=1500), '以太网': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500), 'Loopback Pseudo-Interface 1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1073, mtu=1500), 'WLAN': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=300, mtu=1500), '本地连接* 1': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500), '本地连接* 2': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500)} >>> s=psutil.net_if_stats() >>> s['以太网'].isup True
思考:编写程序,查看本机哪个网络接口是开启的 ?
获取当前网络连接信息
psutil.net_connections() Out[14]: [sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=10000), raddr=(), status='LISTEN', pid=9532), sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.1.104', port=58020), raddr=addr(ip='206.189.32.61', port=443), status='ESTABLISHED', pid=10916), sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.1.104', port=50557), raddr=addr(ip='40.90.189.152', port=443), status='ESTABLISHED', pid=4676), sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=52856), raddr=addr(ip='127.0.0.1', port=52857), status='ESTABLISHED', pid=9228), sconn(fd=-1, family=<AddressFamily.AF_INET6: 23>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='::', port=5353), raddr=(), status='NONE', pid=2324), 。。。
应用:用python编写系统运行报告
import psutil print("CPU的个数:",psutil.cpu_count()) print("CPU的物理总数是:",psutil.cpu_count(logical=False)) print("CPU的空闲时间是:",psutil.cpu_times()) print("CPU的全系统空闲时间是:",psutil.cpu_times(percpu=True)) print("CPU的占用率是:",psutil.cpu_percent()) print("CPU的所有占用率是:",psutil.cpu_percent(percpu=True)) for x in range(10): s=psutil.cpu_percent(interval=1) print("当前cput占比为:",s) print("物理内存是:",psutil.virtual_memory()) print("交换内存是:",psutil.swap_memory()) print("查看磁盘分区:",psutil.disk_partitions()) print("查看磁盘利用率:",psutil.disk_usage('c:\\')) print("查看磁盘io总数:",psutil.disk_io_counters()) print(psutil.disk_io_counters().read_count) print("查看每个磁盘的io数",psutil.disk_io_counters(perdisk=True)) #获取本机ip import socket hostname = socket.gethostname() print("你的主机名是",hostname) print("你的主机ip是",socket.gethostbyname(hostname)) print("网络独写字节个数",psutil.net_io_counters()) print("网络接口信息",psutil.net_if_addrs()) print("网络接口状态",psutil.net_if_stats())
应用:使用python函数持续监控系统状态
import time #导入time模块 import psutil #导入psutil模块 def func(): while True: # -------》持续监控得while循环 mem = psutil.virtual_memory() #----》监控物理内存 disk = psutil.disk_usage(r'c:') #----》监控硬盘 cpu = psutil.cpu_percent(1) #-----》cpu使用率监控 if cpu > 10: print('你的cpu顶不住了,已经使用了%s'%cpu) # 使用占位符 else: print('你的cpu情况还行噢,已经使用了%s'%cpu) if mem[2] > 70: print('你的物理内存顶不住了,占用率为%s'%mem[2]) else: print('你的内存情况还行噢,占用率为%s'%mem[2]) if disk[3] > 70: print('你的C盘里放了多少资源啊,使用率高达%s'%disk[3]) else: print('C盘里东西不多,占用了%s'%disk[3]) time.sleep(3) #----》睡三秒 if __name__ == '__main__': func()
应用:使用邮件模块对系统信息进行报警(未验证)
#连接邮箱服务器 2 import yagmail #请先下载yagmail包,再导入 3 import psutil #导入psutil模块 4 def mail(subject,contents): ---》形参为邮件的标题和内容 5 yag = yagmail.SMTP(user='z1065132644@163.com', password='yn369369', host='smtp.163.com') passwd为授权的密码不是登陆密码 6 #发送邮件 7 yag.send(to='z1065132644@163.com',subject=subject, contents=contents) ————》定义变量subject和contents 8 #断开连接 9 yag.close() 10 11 # import psutil 12 def cpu_info(): ----》函数名尽可能切合内容 13 cpu = psutil.cpu_percent(1) 14 return cpu ----》返回cpu,可以被调用,此return的结果就是调用的结果 15 res=cpu_info() ----》给调用结果赋值。可以省略,下同 16 17 def mem_info(): 18 mem = psutil.virtual_memory() ---》通过ps模块输出内存情况 19 info1={'mem_total':mem[0],'mem_free':mem[1],'mem_percent':mem[2],'mem_used':mem[3]} --》将内存情况放入一个字典,方便调用 20 return info1 21 res2=mem_info() 22 23 def disk_info(): 24 disk = psutil.disk_usage(r'c:') ---》(r'c:')为查看盘的固定写法 25 info2 = {'total': disk[0], 'used': disk[1], 'free': disk[2], 'percent': disk[3]} ---》同样写入一个字典 26 return info2 27 res3=disk_info() 28 29 def main(): ----->定义一个主函数 30 m_cpu = res 31 m_mem = res2 32 m_disk = res3 --->将各个分函数的调用结果当作函数体输入 33 msg=''' ---》赋值msg整个的监控情况,cpu,内存和磁盘使用等 34 cpu使用率%s 35 内存总量%sM ---》使用占位符,单位,注意%%为一个百分比的固定写法 36 内存剩余%sM 37 内存使用率%s 38 内存使用量%sM 39 磁盘总量%sGB 40 磁盘使用量%sGB 41 磁盘剩余量%sGB 42 磁盘使用率%s%% 43 '''\ ---》 换行用 \ 44 %(m_cpu,int(m_mem.get('mem_total')/1024/1024),int(m_mem['mem_free']/1024/1024),m_mem['mem_percent'], int(m_mem['mem_used']/1024/1024),int(m_disk['total']/1024/1024/1024),int(m_disk['used']/1024/1024/1024), int(m_disk['free']/1024/1024/1024),m_disk['percent']) --》int()取整数 46 print(msg) ---》输出整个情况 47 if m_cpu >50: ---》设置报警值,下同 48 mail('cpu报警',msg) ---》给分函数mail的形参传参 49 else: 50 print('cpu正常') 51 if m_mem['mem_percent'] > 50: 52 print('悠着点,内存占用过半了') 53 else: 54 print('relax') 55 if m_disk['percent'] > 50: 56 print('悠着点,磁盘快炸了') 57 else: 58 print('放轻松,没事哦') 59 60 if __name__=='__main__': --》主函数调用固定格式 61 main()