一、模块安装
1、简介
psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。 它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能: 如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。 目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统.
2、安装
CentOS安装psutil包: python版本:3.5 wget https://pypi.python.org/packages/source/p/psutil/psutil-3.2.1.tar.gz --no-check-certificate tar zxvf psutil-3.2.1.tar.gz cd psutil-3.2.1 python setup.py install Windows安装: pip3.exe install psutil
二、获取系统基本信息的使用
1、CPU
使用cpu_times方法获取cpu的完整信息,如下所示: >>> import psutil >>> psutil.cpu_times() scputimes(user=26712.69, nice=6.59, system=16096.79, idle=23242025.75, iowait=37.75, irq=0.0, softirq=568.43, steal=0.0, guest=0.0, guest_nice=0.0) 获取单个数据,如用户的cpu时或io等待时间,如下所示: >>> psutil.cpu_times().user 26712.98 >>> psutil.cpu_times().iowait 37.75 获取cpu逻辑和物理个数,默认logical值为True:
#CPU逻辑个数 >>> psutil.cpu_count() 6 #CPU物理个数 >>> psutil.cpu_count(logical=False) 2 获取cpu的使用率: >>> psutil.cpu_percent() 0.2 >>> psutil.cpu_percent(1) 0.0
2、内存信息
内存信息的获取主要使用virtual_memory方法。swap使用就用swap_memory方法。 >>> MEM = psutil.virtual_memory()
>>> MEM svmem(total=4136796160L, available=3620245504L, percent=12.5, used=1297555456L, free=2839240704L, active=627490816, inactive=404381696, buffers=974848L, cached=780029952) >>> MEM.total 4136796160L >>> MEM.used 1297555456L >>> MEM.free 2839240704L #也可以格式化一下单位 >>> print(MEM.free/1024/1024) 2707 其中percent表示实际已经使用的内存占比。available表示还可以使用的内存。
3、磁盘信息
磁盘信息主要有两部分,一个是磁盘的利用率,另一个是io,他们分别可以通过disk_usage和disk_io_counters方法获取。 如下先获取分区信息,然后看下根分区的使用情况: >>> psutil.disk_partitions() [sdiskpart(device='/dev/mapper/centos-root', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')] >>> psutil.disk_usage('/') sdiskusage(total=304470978560, used=46186463232, free=258284515328, percent=15.2) 默认disk_io_counters方法获取的是硬盘总的io数和读写信息,如果需要获取单个分区的io和读写信息加上"perdisk=True"参数。 >>> psutil.disk_io_counters() sdiskio(read_count=22311, write_count=2684382, read_bytes=871543808, write_bytes=24955394048, read_time=133691, write_time=41573396) >>> psutil.disk_io_counters(perdisk=True) {'fd0': sdiskio(read_count=1, write_count=0, read_bytes=4096, write_bytes=0, read_time=64, write_time=0), 'sr0': sdiskio(read_count=11, write_count=0, read_bytes=45056, write_bytes=0, read_time=79, write_time=0), 'sda2': sdiskio(read_count=10925, write_count=1253459, read_bytes=424309760, write_bytes=12476611584, read_time=63902, write_time=18987876), 'sda1': sdiskio(read_count=297, write_count=2073, read_bytes=23391232, write_bytes=2179072, read_time=617, write_time=354), 'dm-0': sdiskio(read_count=10948, write_count=1428852, read_bytes=422695936, write_bytes=12476611584, read_time=68948, write_time=22585166), 'dm-1': sdiskio(read_count=129, write_count=0, read_bytes=1097728, write_bytes=0, read_time=81, write_time=0)}
4、网络信息
网络io和磁盘io使用方法差不多,主要使用net_io_counters方法,如果需要获取单个网卡的io信息,加上pernic=True参数。 #获取网络总的io情况 >>> psutil.net_io_counters() snetio(bytes_sent=3297791475, bytes_recv=1389796856, packets_sent=8756507, packets_recv=16250143, errin=0, errout=0, dropin=776532, dropout=0) #获取网卡的io情况 >>> psutil.net_io_counters(pernic=True) {'lo': snetio(bytes_sent=4706567, bytes_recv=4706567, packets_sent=71051, packets_recv=71051, errin=0, errout=0, dropin=0, dropout=0), 'ens192': snetio(bytes_sent=3293097784, bytes_recv=1385095182, packets_sent=8685489, packets_recv=16179153, errin=0, errout=0, dropin=776535, dropout=0)}
5、其他系统信息
1.获取开机时间 #以linux时间格式返回,可以使用时间戳转换 >>> psutil.boot_time() 1560134542.0 >>> import datetime >>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H: %M: %S") '2019-06-10 10: 42: 22' 2.查看系统全部进程 >>> psutil.pids() [1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 115, 118, 119, 120, 121, 122, 123, 125, 138, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 453, 462, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 562, 582, 590, 678, 698, 699, 700, 701, 702, 703, 704, 705, 729, 747, 748, 752, 753, 759, 763, 767, 769, 788, 827, 828, 866, 1001, 1003, 1009, 1010, 1011, 1025, 1116, 1124, 1125, 1126, 1127, 1128, 1409, 1411, 1459, 2221, 2329, 2330, 2331, 2332, 2334, 2335, 2337, 2338, 2339, 2340, 2920, 2967, 3043, 4002, 4255, 4257, 4283, 4284, 4300, 4547, 4677, 5304, 5307, 5871, 6189, 6252, 6529, 6559, 6560, 6588, 10618, 10622, 10629, 10631, 20556, 21194, 24406, 25219, 28097] 3.查看单个进程 p = psutil.Process(10631) p.name() #进程名 p.exe() #进程的bin路径 p.cwd() #进程的工作目录绝对路径 p.status() #进程状态 p.create_time() #进程创建时间 p.uids() #进程uid信息 p.gids() #进程的gid信息 p.cpu_times() #进程的cpu时间信息,包括user,system两个cpu信息 p.cpu_affinity() #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好 p.memory_percent() #进程内存利用率 p.memory_info() #进程内存rss,vms信息 p.io_counters() #进程的IO信息,包括读写IO数字及参数 p.connectios() #返回进程列表 p.num_threads() #进程开启的线程数 psutil的Popen方法启动应用程序,可以跟踪程序的相关信息 from subprocess import PIPE p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"],stdout=PIPE) p.name() p.username()
6、 查看系统硬件脚本
#!/usr/bin/env python #coding:utf-8 import psutil import datetime import time # 当前时间 now_time = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time())) print(now_time) # 查看cpu物理个数的信息 print(u"物理CPU个数: %s" % psutil.cpu_count(logical=False)) #CPU的使用率 cpu = (str(psutil.cpu_percent(1))) + '%' print(u"cup使用率: %s" % cpu) #查看内存信息,剩余内存.free 总共.total #round()函数方法为返回浮点数x的四舍五入值。 free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2)) total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2)) memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total) print(u"物理内存: %s G" % total) print(u"剩余物理内存: %s G" % free) print(u"物理内存使用率: %s %%" % int(memory * 100)) # 系统启动时间 print(u"系统启动时间: %s" % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")) # 系统用户 users_count = len(psutil.users()) # # >>> for u in psutil.users(): # ... print(u) # ... # suser(name='root', terminal='pts/0', host='61.135.18.162', started=1505483904.0) # suser(name='root', terminal='pts/5', host='61.135.18.162', started=1505469056.0) # >>> u.name # 'root' # >>> u.terminal # 'pts/5' # >>> u.host # '61.135.18.162' # >>> u.started # 1505469056.0 # >>> users_list = ",".join([u.name for u in psutil.users()]) print(u"当前有%s个用户,分别是 %s" % (users_count, users_list)) #网卡,可以得到网卡属性,连接数,当前流量等信息 net = psutil.net_io_counters() bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024) bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024) print(u"网卡接收流量 %s 网卡发送流量 %s" % (bytes_rcvd, bytes_sent)) io = psutil.disk_partitions() # print(io) # print("io[-1]为",io[-1]) #del io[-1] print('-----------------------------磁盘信息---------------------------------------') print("系统磁盘信息:" + str(io)) for i in io: o = psutil.disk_usage(i.device) print("总容量:" + str(int(o.total / (1024.0 * 1024.0 * 1024.0))) + "G") print("已用容量:" + str(int(o.used / (1024.0 * 1024.0 * 1024.0))) + "G") print("可用容量:" + str(int(o.free / (1024.0 * 1024.0 * 1024.0))) + "G") print('-----------------------------进程信息-------------------------------------') # 查看系统全部进程 for pnum in psutil.pids(): p = psutil.Process(pnum) print(u"进程名 %-20s 内存利用率 %-18s 进程状态 %-10s 创建时间 %-10s " \ % (p.name(), p.memory_percent(), p.status(), p.create_time()))