10.17 psutil

用Python编写脚本简化日常的运维工作是Python的一个重要途径。在Linux下,有许多系统命令可以让我们时刻监控系统运行的状态,如ps、top、free等。要获取这些系统信息,Python可以通过subprocess模块调用并获取结果。但这样做显得很麻烦,尤其是要写很多解析代码。

在Python中获取系统信息的另一个好方法是使用psutil这个第三方模块。psutil=process and system utilities,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理和运行维护不可或缺的必备模块。

 

CPU

①CPU物理和逻辑数量

psutil.cpu_count(logical=True)

import psutil
psutil.cpu_count() #cpu数量
psutil.cpu_count(logical=False) #CPU物理核心

8
4
#4说明是4核超线程,8则是8核非超线程

②统计CPU的用户/系统时间和空闲时间

psutil.cpu_times()

psutil.cpu_times()
scputimes(user=8465.375, system=5684.421, idle=63745.359)

③实现类似Linux中的top命令的CPU使用率,每秒刷新一次,累计10次:

psutil.cpu_percent(interval=None,percpu=True)

interval表每秒刷新次数,percpu表是否对每个CPU都统计

for i in range(10):
    print(psutil.cpu_percent(interval=1,percpu=True))
    
[7.8, 10.4, 21.2, 14.9, 18.5, 12.3, 4.7, 7.8]
[19.7, 9.5, 10.6, 21.5, 17.2, 22.2, 40.0, 34.2]
[7.8, 13.6, 12.5, 6.2, 4.7, 1.5, 6.2, 3.1]
[6.2, 6.2, 13.4, 4.7, 7.8, 1.6, 0.0, 14.9]
[7.6, 4.6, 6.2, 7.6, 1.6, 1.6, 3.1, 3.1]
[3.1, 15.6, 4.7, 12.5, 18.2, 1.6, 12.1, 9.4]
[15.2, 20.3, 10.9, 30.4, 16.9, 3.1, 9.4, 30.1]
[13.6, 21.9, 28.2, 26.6, 7.8, 7.8, 1.6, 6.2]
[16.4, 21.7, 10.8, 10.8, 0.0, 1.5, 4.6, 1.5]
[20.3, 31.8, 37.5, 32.8, 39.1, 40.6, 28.1, 34.4]

 

内存

物理内存:psutil.virtual_memory()

交换内存:psutil.swap_memory()

psutil.virtual_memory()
svmem(total=8420118528, available=3325693952, percent=60.5, used=5094424576, free=3325693952)

psutil.swap_memory()
sswap(total=20768149504, used=7475101696, free=13293047808, percent=36.0, sin=0, sout=0)

返回的是整数字节,可以看出,总内存大小是8420118528B=7.84GB,已用5094424576B,使用了60.5%,这一点与我们通过任务管理器查看时的数据相同。

交换区的大小为20768149504B=19.34GB(?,不清楚为啥交换内存比物理内存还大)

 

磁盘

磁盘分区:psutil.disk_partitions()

磁盘使用率:psutil.disk_usage()

磁盘IO:psutil.disk_io_counters()

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='NTFS', opts='rw,fixed'), sdiskpart(device='F:\\', mountpoint='F:\\', fstype='NTFS', opts='rw,fixed')]

psutil.disk_usage('/')
sdiskusage(total=511456907264, used=211497590784, free=299959316480, percent=41.4)

psutil.disk_io_counters()
sdiskio(read_count=550697, write_count=200724, read_bytes=13235060736, write_bytes=6917516800, read_time=1614, write_time=230)

可见,磁盘'/'的总容量是511456907264B=476GB,使用了41.4%。

文件格式时NTFS,opts中包含rw表示可读写

 

网络

网络读写字节/包的个数:psutil.net_io_counters()

网络接口信息:psutil.net_if_addrs()

网络接口状态:psutil.net_if_stats()

psutil.net_io_counters() #网络读写字节/包 个数
snetio(bytes_sent=209187079, bytes_recv=2026807491, packets_sent=975474, packets_recv=1859727, errin=0, errout=0, dropin=0, dropout=0)

#网络接口信息
psutil.net_if_addrs()
{'以太网': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='80-FA-5B-6B-05-F2', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.127.89', netmask='255.255.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::5985:31ec:7c0e:7f59', netmask=None, broadcast=None, ptp=None)], '本地连接* 1': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='38-00-25-84-F0-09', netmask=None, broadcast=None, ptp=None),...]

psutil.net_if_stats()
{'以太网': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
 '以太网 2': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=10, mtu=1400), '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=86, 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)}

要获取当前网络连接信息,使用psutil.net_connections()

psutil.net_connections()
[sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=1, laddr=addr(ip='127.0.0.1', port=56381), raddr=addr(ip='127.0.0.1', port=56380), status='ESTABLISHED', pid=10584), 
sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=1, laddr=addr(ip='0.0.0.0', port=49669), raddr=(), status='LISTEN', pid=4024), 
sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=2, laddr=addr(ip='127.0.0.1', port=49938), raddr=(), status='NONE', pid=11676), ...]

 

进程

获取所有进程ID:psutil.pids()

获取制定进程:psutil.Process(进程ID)

psutil.pids() #所有进程ID
[0, 4, 100, 120, ... , 13876]

p=psutil.Process(13496)#获取指定进程ID=13496,也就是当前运行的Python

p.name() #进程名称
'python.exe'

p.exe() #进程exe路径
'D:\\Anaconda\\Anaconda3\\python.exe'

p.cwd() #进程工作目录
'C:\\Users\\Le\\Desktop\\Test\\Test'

p.cmdline() #进程启动的命令行
['D:\\Anaconda\\Anaconda3\\python.exe', 'C:\\Program Files\\JetBrains\\PyCharm 2019.1.3\\helpers\\pydev\\pydevconsole.py', '--mode=client', '--port=56367']

p.ppid() #父进程ID
10584

p.parent() #父进程
psutil.Process(pid=10584, name='pycharm64.exe', started='11:54:02')

p.children() #子进程列表
[psutil.Process(pid=13452, name='conhost.exe', started='11:59:34')]

p.status() #进程状态
'running'

p.username()#进程用户名
'DESKTOP-NQMF3OU\\Le'

p.create_time()#进程创建时间
1602907174.0

p.cpu_times() #进程使用的CPU时间
pcputimes(user=1.46875, system=1.796875, children_user=0.0, children_system=0.0)

p.memory_info() #进程使用的内存
pmem(rss=26845184, vms=41582592, num_page_faults=16684, ...)

p.open_files() #进程打开的文件
[popenfile(path='C:\\Windows\\System32\\zh-CN\\KernelBase.dll.mui', fd=-1), popenfile(path='C:\\Windows\\System32\\zh-CN\\kernel32.dll.mui', fd=-1)]

p.connections() #进程相关的网络连接
[pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=1, laddr=addr(ip='127.0.0.1', port=56433), raddr=addr(ip='127.0.0.1', port=56367), status='ESTABLISHED')]

p.num_threads() #进程的线程数量
4

p.threads() #所有线程信息
[pthread(id=5116, user_time=1.25, system_time=1.84375), pthread(id=14100, user_time=0.0, system_time=0.0), pthread(id=14120, user_time=0.28125, system_time=0.0), pthread(id=6888, user_time=0.0, system_time=0.0)]

p.environ() #进程环境变量

p.terminate() #结束进程
Process finished with exit code 15 #自己把自己结束了

 

psutil使得Python程序获取系统信息变得易如反掌。

此外,psutil还可以获取用户信息、Windows服务等很多有用的系统信息,具体可以参考psutil官网

 

posted @ 2020-10-17 13:27  ShineLe  阅读(50)  评论(0)    收藏  举报