用Python来编写脚本简化日常的运维工作是Python的一个重要用途。在Linux下,有许多系统命令可以让我们时刻监控系统运行的状态,如ps
,top
,free
等等。要获取这些系统信息,Python可以通过subprocess
模块调用并获取结果。但这样做显得很麻烦,尤其是要写很多解析代码。
在Python中获取系统信息的另一个好办法是使用psutil
这个第三方模块。顾名思义,psutil = process and system utilities,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理员和运维小伙伴不可或缺的必备模块。
psutil是一个开源且跨平台的库,其提供了便利的函数用来获取才做系统的信息,比如CPU,内存,磁盘,网络等。此外,psutil还可以用来进行进程管理,包括判断进程是否存在、获取进程列表、获取进程详细信息等。而且psutil还提供了许多命令行工具提供的功能,包括:ps,top,lsof,netstat,ifconfig, who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。
psutil是一个跨平台的库,在官方网站上查到其支持如下操作系统。
安装
pip install psutil
检测类型
CPU
函数 |
描述 |
psutil.cpu_count() |
cpu_count(,[logical]):默认返回逻辑CPU的个数,当设置logical的参数为False时,返回物理CPU的个数。 |
psutil.cpu_percent() |
cpu_percent(,[percpu],[interval]):返回CPU的利用率,percpu为True时显示所有物理核心的利用率,interval不为0时,则阻塞时显示interval执行的时间内的平均利用率 |
psutil.cpu_times() |
cpu_times(,[percpu]):以命名元组(namedtuple)的形式返回cpu的时间花费,percpu=True表示获取每个CPU的时间花费 |
psutil.cpu_times_percent() |
cpu_times_percent(,[percpu]):功能和cpu_times大致相同,看字面意思就能知道,该函数返回的是耗时比例。 |
psutil.cpu_stats() |
cpu_stats()以命名元组的形式返回CPU的统计信息,包括上下文切换,中断,软中断和系统调用次数。 |
psutil.cpu_freq() |
cpu_freq([percpu]):返回cpu频率 |
import psutil
print('逻辑CPU个数:',psutil.cpu_count())
print('物理CPU个数:',psutil.cpu_count(logical=False))
print('CPU利用率:',psutil.cpu_percent())
print('CPU花费时间:',psutil.cpu_times())
print('CPU耗时比例:',psutil.cpu_times_percent())
print('CPU统计数据:',psutil.cpu_stats())
print('CPU频率:',psutil.cpu_freq())
'''
逻辑CPU个数: 8
物理CPU个数: 4
CPU利用率: 0.0
CPU花费时间: scputimes(user=1530.0, system=792.0625, idle=28419.765624999996, interrupt=37.53125, dpc=94.859375)
CPU耗时比例: scputimes(user=0.0, system=0.0, idle=0.0, interrupt=0.0, dpc=0.0)
CPU统计数据: scpustats(ctx_switches=74195467, interrupts=48949992, soft_interrupts=0, syscalls=199058572)
CPU频率: scpufreq(current=2419.0, min=0.0, max=2419.0)
'''
内存memory
函数 |
描述 |
virtual_memory() |
获取系统内存的使用情况,以命名元组的形式返回内存使用情况,包括总内存,可用内存,内存利用率,buffer和cache等。单位为字节。 |
swap_memory() |
获取系统交换内存的统计信息,以命名元组的形式返回swap/memory使用情况,包含swap中页的换入和换出。 |
import psutil
print('内存使用情况:',psutil.virtual_memory())
print('系统交换内存统计:',psutil.swap_memory())
'''
内存使用情况: svmem(total=16805064704, available=6475837440, percent=61.5, used=10329227264, free=6475837440)
系统交换内存统计: sswap(total=5637144576, used=1095626752, free=4541517824, percent=19.4, sin=0, sout=0)
'''
磁盘disk
函数 |
描述 |
psutil.disk_io_counters() |
disk_io_counters([perdisk]):以命名元组的形式返回磁盘io统计信息(汇总的),包括读、写的次数,读、写的字节数等。 当perdisk的值为True,则分别列出单个磁盘的统计信息(字典:key为磁盘名称,value为统计的namedtuple)。 |
psutil.disk_partitions() |
disk_partitions([all=False]):以命名元组的形式返回所有已挂载的磁盘,包含磁盘名称,挂载点,文件系统类型等信息。 当all等于True时,返回包含/proc等特殊文件系统的挂载信息 |
psutil.disk_usage() |
disk_usage(path):以命名元组的形式返回path所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。 |
import psutil
print('磁盘io统计:',psutil.disk_io_counters())
print('磁盘io分磁盘统计:',psutil.disk_io_counters(perdisk=True))
print('已挂载磁盘:',psutil.disk_partitions())
print('c盘所在磁盘使用情况:',psutil.disk_usage(path='c:/'))
'''
磁盘io统计: sdiskio(read_count=227922, write_count=109967, read_bytes=8124451840, write_bytes=3854718464, read_time=220, write_time=33)
磁盘io分磁盘统计: {'PhysicalDrive0': sdiskio(read_count=227922, write_count=109967, read_bytes=8124451840, write_bytes=3854718464, read_time=220, write_time=33)}
已挂载磁盘: [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260)]
c盘所在磁盘使用情况: sdiskusage(total=107374178304, used=75255386112, free=32118792192, percent=70.1)
'''
网络net
函数 |
详情 |
psutil.net_io_counter([pernic]) |
以命名元组的形式返回当前系统中每块网卡的网络io统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。当pernic为True时,则列出所有网卡的统计信息。 |
psutil.net_connections([kind]) |
以列表的形式返回每个网络连接的详细信息(namedtuple)。命名元组包含fd, family, type, laddr, raddr, status, pid等信息。kind表示过滤的连接类型,支持的值如下:(默认为inet) |
psutil.net_if_addrs() |
以字典的形式返回网卡的配置信息,包括IP地址和mac地址、子网掩码和广播地址。 |
psutil.net_if_stats() |
返回网卡的详细信息,包括是否启动、通信类型、传输速度与mtu。 |
import psutil
print('各网卡io统计:',psutil.net_io_counters())
print('当前每个网络连接详细信息:',psutil.net_connections())
print('网卡配置信息:',psutil.net_if_addrs())
print('网卡详细信息:',psutil.net_if_stats())
'''
各网卡io统计: snetio(bytes_sent=84594155, bytes_recv=175658111, packets_sent=113985, packets_recv=243075, errin=0, errout=0, dropin=40, dropout=0)
当前每个网络连接详细信息: [sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=52732), ... , status='ESTABLISHED', pid=9624)]
网卡配置信息: {'WLAN': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='D4-1B-81-2F-22-C3', ... , address='::1', netmask=None, broadcast=None, ptp=None)]}
网卡详细信息: {'本地连接* 18': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500)}
'''
进程pid
函数 |
描述 |
psutil.pids() |
以列表的形式返回当前正在运行的进程 |
psutil.pid_exists(1) |
判断给点定的pid是否存在 |
psutil.process_iter() |
迭代当前正在运行的进程,返回的是每个进程的Process对象 |
psutil.Process( pid ) |
对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号。传入参数为pid |
psutil.Process( pid )
获取进程相关信息的方法:
- name():获取进程的名称
- cmdline():获取启动进程的命令行参数
- create_time():获取进程的创建时间(时间戳格式)
- num_fds():进程打开的文件个数
- num_threads():进程的子进程个数
- is_running():判断进程是否正在运行
- send_signal():给进程发送信号,类似与os.kill等
- kill():发送SIGKILL信号结束进程
- terminate():发送SIGTEAM信号结束进程
传感器sensors
函数 |
描述 |
psutil.sensors_temperatures(fahrenheit=False) |
返回硬件的温度 |
psutil.sensors_fans() |
返回电池状态 |
psutil.sensors_battery() |
返回硬件风扇速度 |
其他
函数 |
描述 |
psutil.users() |
以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端,与主机信息 |
psutil.boot_time() |
以时间戳的形式返回系统的启动时间 |