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官网

浙公网安备 33010602011771号