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 排列组合之itertools
Mar 20 Python
Python中的并发编程实例
Jul 07 Python
详解Python中for循环的使用
Apr 14 Python
Python实现telnet服务器的方法
Jul 10 Python
高质量Python代码编写的5个优化技巧
Nov 16 Python
python机器人行走步数问题的解决
Jan 29 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
如何解决django-celery启动后迅速关闭
Oct 16 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 特殊字符处理函数
2008/09/05 PHP
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
PHP7新特性
2021/03/09 PHP
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
js实现图片无缝循环轮播
2019/10/28 Javascript
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
Java servlet面试题
2012/03/04 面试题
员工自我鉴定范文
2013/10/06 职场文书
个人自荐书
2013/12/20 职场文书
校运会广播稿100字
2014/01/27 职场文书
高三高考决心书
2014/03/11 职场文书
社区党务公开实施方案
2014/03/18 职场文书
信息技术课后反思
2014/04/27 职场文书
运动会闭幕词
2015/01/28 职场文书
校车安全管理责任书
2015/05/11 职场文书
湘江北去观后感
2015/06/15 职场文书
用php如何解决大文件分片上传问题
2021/07/07 PHP