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 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
python实现根据窗口标题调用窗口的方法
Mar 13 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
django ajax json的实例代码
May 29 Python
python实现字符串和字典的转换
Sep 29 Python
python使用正则表达式来获取文件名的前缀方法
Oct 21 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
python 表格打印代码实例解析
Oct 12 Python
使用python实现回文数的四种方法小结
Nov 24 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 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
ftp类(myftp.php)
2006/10/09 PHP
php 全文搜索和替换的实现代码
2008/07/29 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
Javascript浅谈之引用类型
2013/12/18 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
python网络编程学习笔记(四):域名系统
2014/06/09 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
django迁移文件migrations的实现
2020/03/31 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
Python高并发和多线程有什么关系
2020/11/14 Python
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
医药专业应届毕业生求职信范文
2014/01/01 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
写给领导的感谢信
2015/01/22 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书