Python监控服务器实用工具psutil使用解析


Posted in Python onDecember 19, 2019

这篇文章主要介绍了Python监控服务器实用工具psutil使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

服务器的监控通过安装一些常用的监控软件之外,有时也需要运行一些shell或Python脚本;shell下可以使用系统自带的ps/free/top/df等shell命令,Python可以调用subprocess等模块来运行shell命令,不过这么做就比较麻烦。这里有一个比较好用的第三方模块:psutil。

psutil是一个跨平台的库,用于在Python中检索有关运行进程和系统利用率(CPU,内存,磁盘,网络,传感器)的信息。它主要用于系统监视,分析,限制进程资源和运行进程的管理。它实现了UNIX命令行工具提供的许多功能,例如:ps,top,lsof,netstat,ifconfig,who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。 psutil目前支持以下平台:

  • Linux
  • Windows
  • OSX,
  • FreeBSD, OpenBSD, NetBSD
  • Sun Solaris
  • AIX

...

等装有Python2.6至3.6的32-bit和64-bit架构. 也可以在PyPy上运行。

安装

文中示例均在Python版本3.6环境下运行;

# pip3 install psutil

常用模块

获取psutil版本信息

In [1]: import psutil
In [2]: psutil.version_info
Out[2]: (5, 4, 3

获取CPU信息

In [3]: psutil.cpu_count() # 逻辑CPU核数
Out[3]: 4
In [4]: psutil.cpu_count(logical=False) # 物理CPU核数
Out[4]: 2
In [5]: psutil.cpu_times() # CPU的用户、系统、空闲时间
Out[5]: scputimes(user=240773.0, nice=0.0, system=96416.32, idle=1161930.41)
In [9]: psutil.cpu_percent(percpu=True) # 获取每个CPU的使用率,类似TOP命令
Out[9]: [43.3, 22.0, 42.0, 23.0]
In [10]: top = [psutil.cpu_percent(interval=i, percpu=True) for i in range(10)] #设置每秒刷新时间间隔,统计十次的结果
In [11]: top
Out[11]:
[[40.8, 19.7, 38.5, 20.7],
[25.7, 5.9, 13.0, 5.0],
[35.0, 15.6, 30.0, 14.4],
[23.7, 7.0, 18.3, 7.4],
[38.5, 17.0, 34.2, 17.5],
[37.2, 19.6, 36.3, 20.0],
[29.6, 16.6, 28.8, 16.8],
[37.7, 19.0, 35.4, 18.7],
[30.8, 16.3, 26.9, 16.5],
[44.2, 27.9, 41.5, 28.6]]

获取内存信息

In [13]: psutil.virtual_memory() #获取内存统计数据,单位bytes,我这里8G内存
Out[13]: svmem(total=8589934592, available=1891045376, percent=78.0, used=6053986304, free=15130624, active=1878392832, inactive=1875914752, wired=2299678720)
In [14]: psutil.swap_memory() # 获取swap的统计数据
Out[14]: sswap(total=2147483648, used=1340866560, free=806617088, percent=62.4, sin=126090076160, sout=3524710400)

获取磁盘信息

In [17]: psutil.disk_partitions() #获取磁盘分区信息
Out[17]: [sdiskpart(device='/dev/disk1', mountpoint='/', fstype='hfs', opts='rw,local,rootfs,dovolfs,journaled,multilabel')]
In [20]: psutil.disk_usage('/') # 获取分区使用情况,这里使用了25.4%
Out[20]: sdiskusage(total=499055067136, used=126482944000, free=372309979136, percent=25.4)
In [22]: psutil.disk_io_counters() #磁盘IO情况
Out[22]: sdiskio(read_count=7364142, write_count=6510641, read_bytes=282106464256, write_bytes=261763244544, read_time=2608778, write_time=1095259)

获取网络信息

In [23]: psutil.net_if_stats() # 获取网卡接口状态
Out[23]:
{'awdl0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1484),
'bridge0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500),
'en0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500),
'en1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
'en2': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
'gif0': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1280),
'lo0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=16384),
'p2p0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=2304),
'stf0': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1280),
'utun0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=2000),
'utun1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1352)}
In [25]: psutil.net_if_stats().get("en0") #获取单个网卡en0的状态
Out[25]: snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500)
In [26]: psutil.net_if_addrs() # 获取所有网卡的地址信息
Out[26]:
{'awdl0': [snic(family=<AddressFamily.AF_LINK: 18>, address='36:7d:f3:80:6e:4e', netmask=None, broadcast=None, ptp=None),
snic(family=<AddressFamily.AF_INET6: 30>, address='fe80::347d:f3ff:fe80:6e4e%awdl0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)],
'bridge0': [snic(family=<AddressFamily.AF_LINK: 18>, address='4a:00:02:c0:33:70', netmask=None, broadcast=None, ptp=None)],
'en0': [snic(family=<AddressFamily.AF_INET: 2>, address='192.168.0.101', netmask='255.255.255.0', broadcast='192.168.0.255', ptp=None),
snic(family=<AddressFamily.AF_LINK: 18>, address='ac:bc:32:91:32:8b', netmask=None, broadcast=None, ptp=None),
snic(family=<AddressFamily.AF_INET6: 30>, address='fe80::1476:ce7e:210a:2e32%en0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)],
'en1': [snic(family=<AddressFamily.AF_LINK: 18>, address='4a:00:02:c0:33:70', netmask=None, broadcast=None, ptp=None)],
'en2': [snic(family=<AddressFamily.AF_LINK: 18>, address='4a:00:02:c0:33:71', netmask=None, broadcast=None, ptp=None)],
'lo0': [snic(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None),
snic(family=<AddressFamily.AF_INET6: 30>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
snic(family=<AddressFamily.AF_INET6: 30>, address='fe80::1%lo0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)],
'p2p0': [snic(family=<AddressFamily.AF_LINK: 18>, address='0e:bc:32:91:32:8b', netmask=None, broadcast=None, ptp=None)],
'utun0': [snic(family=<AddressFamily.AF_INET6: 30>, address='fe80::583c:77a0:6b93:b045%utun0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)],
'utun1': [snic(family=<AddressFamily.AF_INET: 2>, address='10.5.200.244', netmask=None, broadcast=None, ptp='10.5.200.244')]}
# 获取en0网卡的地址, 这里包括mac和ipv6地址
In [40]: for addr in psutil.net_if_addrs().get("en0"):
...: print(addr.address)
192.168.0.101
ac:bc:32:91:32:8b
fe80::1476:ce7e:210a:2e32%en0
In [43]: psutil.net_io_counters() # 获取网络读写字节/包的个数
Out[43]: snetio(bytes_sent=174614221, bytes_recv=586279725, packets_sent=863903, packets_recv=873583, errin=0, errout=0, dropin=0, dropout=0)
In [45]: psutil.net_connections() # 获取网络连接信息,注意这里需要root权限。

获取进程信息:

In [46]: psutil.pids() # 获取所有进程ID
In [47]: psutil.Process(61) # 获取指定PID的进程信息
Out[47]: psutil.Process(pid=61, name='dsAccessService', started='2018-02-26 09:57:04')
In [49]: psutil.Process(45573).exe() # 获取进程的exe路径
Out[49]: '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python'
In [50]: psutil.Process(45573).name() # 获取进程名称
Out[50]: 'Python'
In [52]: psutil.Process(45573).cmdline() # 获取进程启动的命令
Out[52]:
['/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python',
'/usr/local/bin/ptipython']
In [56]: psutil.Process(45573).num_threads() # 获取进程的线程数量
Out[56]: 3
In [57]: psutil.Process(45573).environ() # 获取进程的环境变量信息

总结:

使用psutil模块可以做到比较全面的对系统的监控,如果你正在考虑用Python做一个监控系统或者脚本工具,可以有些考虑此模块。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈Python的文件类型
May 30 Python
python实现单线程多任务非阻塞TCP服务端
Jun 13 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
python跳出双层for循环的解决方法
Jun 24 Python
Python Pandas数据结构简单介绍
Jul 03 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 Python
pytorch MSELoss计算平均的实现方法
May 12 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
Jun 01 Python
Python使用pymysql模块操作mysql增删改查实例分析
Dec 19 #Python
python 普通克里金(Kriging)法的实现
Dec 19 #Python
Python函数参数类型及排序原理总结
Dec 19 #Python
python中with语句结合上下文管理器操作详解
Dec 19 #Python
Django中密码的加密、验密、解密操作
Dec 19 #Python
利用OpenCV和Python实现查找图片差异
Dec 19 #Python
Python文本处理简单易懂方法解析
Dec 19 #Python
You might like
php 生成饼图 三维饼图
2009/09/28 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
python实现提取百度搜索结果的方法
2015/05/19 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
python中添加模块导入路径的方法
2021/02/03 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
主持人婚宴答谢词
2014/01/28 职场文书
代理班主任的自我评价
2014/02/04 职场文书
班组长竞聘书
2014/03/31 职场文书
安全施工标语
2014/06/07 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
有关浪费资源的建议书
2015/09/14 职场文书