Python psutil库系统监控实战:CPU、内存、磁盘与网络全解析
本文详细介绍Python第三方库psutil的使用方法。该库支持跨平台系统监控,可替代top、netstat等UNIX命令。内容涵盖获取CPU占用率与频率、查看内存与磁盘分区及IO状态、查询网络连接与接口信息,以及电池、用户和进程PID等系统数据,帮助开发者高效实现系统管理脚本。
鉴于Bash脚本开发的复杂性,许多运维工程师转而采用Python编写各类自动化脚本。
尽管可以通过Python调用Bash指令来执行功能,但为各种命令编写包装器并解析输出结果过于繁琐。因此,直接使用原生Python库成为更优选择。
本文推荐一个实用的Python库psutil。
psutil是一个跨平台系统监控库,能够获取CPU、内存、磁盘和网络等系统信息,以及进程相关数据。
该库可用于替代以下UNIX系统命令:ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice, ionice, iostat, iotop, uptime, pidof, tty, taskset, pmap
以下是具体的使用示例:
>>> import psutil # 加载库
CPU信息
获取CPU占用率
>>> psutil.cpu_percent(interval=5)
12.9
查看CPU频率
>>> psutil.cpu_freq()
scpufreq(current=2300, min=2300, max=2300)
查询CPU负载
>>> psutil.getloadavg()
(2.21044921875, 2.4814453125, 2.74609375)
内存信息
检查内存使用状况
>>> psutil.virtual_memory()
svmem(total=8589934592, available=1664913408, percent=80.6, used=5807058944, free=15069184, active=1651421184, inactive=1649065984, wired=4155637760)
磁盘信息
获取磁盘分区详情
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/disk1s5', mountpoint='/', fstype='apfs', opts='ro,local,rootfs,dovolfs,journaled,multilabel', maxfile=255, maxpath=1024), ...]
查看磁盘占用率
>>> psutil.disk_usage('/')
sdiskusage(total=250685575168, used=11233398784, free=14531440640, percent=43.6)
监控磁盘IO
>>> psutil.disk_io_counters()
sdiskio(read_count=190236826, write_count=110716593, read_bytes=11349786423296, write_bytes=9505852936192, read_time=165443373, write_time=100234117)
网络信息
查询网络连接状态(类似netstat)
>>> import psutil
>>> psutil.net_connections()
[pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254),
pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987),
pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=60759), raddr=addr(ip='72.14.234.104', port=80), status='ESTABLISHED', pid=None),
pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=51314), raddr=addr(ip='72.14.234.83', port=443), status='SYN_SENT', pid=None)
...]
获取网络接口信息(类似ifconfig)
>>> psutil.net_if_addrs()
{'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None),
snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
snicaddr(family=<AddressFamily.AF_LINK: 17>, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)],
'wlan0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None),
snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),
snicaddr(family=<AddressFamily.AF_LINK: 17>, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}
其他系统信息
电池状态
>>> psutil.sensors_battery()
sbattery(percent=93, secsleft=15420, power_plugged=False)
当前登录用户
>>> psutil.users()
[suser(name='myname', terminal='console', host=None, started=1604809088.0, pid=180), suser(name='yuliji', terminal='ttys012', host=None, started=1615375616.0, pid=13894)]
进程信息
获取进程ID
>>> psutil.pids()
[1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, ..., 32498]
列出所有进程
>>> for proc in psutil.process_iter(['pid', 'name', 'username']):
... print(proc.info)
...
{'name': 'systemd', 'pid': 1, 'username': 'root'}
{'name': 'kthreadd', 'pid': 2, 'username': 'root'}
{'name': 'ksoftirqd/0', 'pid': 3, 'username': 'root'}
如需更多详细信息,请访问官方文档:psutil.readthedocs.io/en/latest/
以上为Python psutil库的使用示例,更多相关技术文章请持续关注本站更新。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









