一.python中的psutil模块详解
1.psutil模块简介
psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能,如ps、top、lsofnetstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统.
2.psutil模块安装
pip3 install psutil -i https://pypi.douban.com/simple
3.运用命令行获取系统基本信息
1.CPU信息
使用cpu_times方法获取cpu的完整信息,如下所示。
>>> psutil.cpu_times()
scputimes(user=650613.02, nice=22.14, system=154916.5, idle=16702285.26, iowait=68894.55, irq=3.38, softirq=7075.65, steal=0.0, guest=0.0)
>>>
获取单个数据,如用户的cpu时或io等待时间,如下所示:
>>> psutil.cpu_times().user
650617.11
>>> psutil.cpu_times().iowait
68894.63
>>>
获取cpu逻辑和物理个数,默认logical值为True 。
#CPU逻辑个数
>>> psutil.cpu_count()
2
#CPU物理个数
>>> psutil.cpu_count(logical=False)
1
>>>
获取cpu的使用率:
#CPU逻辑个数
>>> psutil.cpu_count()
2
#CPU物理个数
>>> psutil.cpu_count(logical=False)
1
>>>
2.内存信息
内存信息的获取主要使用virtual_memory方法。swap使用就用swap_memory方法。
>>> mem = psutil.virtual_memory()
>>> mem
svmem(total=4018601984, available=1066205184, percent=73.5, used=3904004096, free=114597888, active=3302174720, inactive=426078208, buffers=156520448, cached=795086848)
>>> mem.total
4018601984
>>> mem.used
3904004096
>>> mem.free
114597888
>>> print(mem.total/1024/1024)
3832.4375
>>>
其中percent表示实际已经使用的内存占比,即(1047543808-717537280)/1047543808*100% 。available表示还可以使用的内存。
3.磁盘信息
磁盘信息主要有两部分,一个是磁盘的利用率,一个是io,他们分别可以通过disk_usage和disk_io_counters方法获取。
如下先获取分区信息,然后看下根分区的使用情况:
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/mapper/root', mountpoint='/', fstype='ext4', opts='rw,errors=remount-ro'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='ext2', opts='rw')]
>>> psutil.disk_usage('/')
sdiskusage(total=42273669120, used=17241096192, free=22885195776, percent=40.8)
>>>
默认disk_io_counters方法获取的是硬盘总的io数和读写信息,如果需要获取单个分区的io和读写信息加上"perdisk=True"参数。
>>> psutil.disk_io_counters()
sdiskio(read_count=638190, write_count=77080153, read_bytes=16037795840, write_bytes=1628871606272, read_time=2307367, write_time=1777841305)
>>> psutil.disk_io_counters(perdisk=True)
{'vdb1': sdiskio(read_count=312, write_count=0, read_bytes=1238016, write_bytes=0, read_time=95, write_time=0), 'vda1': sdiskio(read_count=637878, write_count=77080257, read_bytes=16036557824, write_bytes=1628873314304, read_time=2307272, write_time=1777841879)}
>>>
4.网络信息:
网络io和磁盘io使用方法差不多,主要使用net_io_counters方法,如果需要获取单个网卡的io信息,加上pernic=True参数。
#获取网络总的io情况
>>>
>>> psutil.net_io_counters()
snetio(bytes_sent=525490132009, bytes_recv=409145642892, packets_sent=948527563, packets_recv=778182181, errin=0, errout=0, dropin=0, dropout=0)
#获取网卡的io情况
>>>
>>> psutil.net_io_counters(pernic=True)
{'lo': snetio(bytes_sent=56524704027, bytes_recv=56524704027, packets_sent=33602236, packets_recv=33602236, errin=0, errout=0, dropin=0, dropout=0), 'eth0': snetio(bytes_sent=468966480940, bytes_recv=352622081327, packets_sent=914930488, packets_recv=744583332, errin=0, errout=0, dropin=0, dropout=0)}
>>>
5.其他系统信息:
1.获取开机时间
##以linux时间格式返回,可以使用时间戳转换
>>> psutil.boot_time()
1496647567.0
#转换成自然时间格式
>>> psutil.boot_time()
1496647567.0
>>> datetime.datetime.fromtimestamp(psutil.boot_time ()).strftime("%Y-%m-%d %H: %M: %S")
'2017-06-05 15: 26: 07'
>>>
2.查看系统全部进程
##以linux时间格式返回,可以使用时间戳转换
>>> psutil.boot_time()
1496647567.0
#转换成自然时间格式
>>> psutil.boot_time()
1496647567.0
>>> datetime.datetime.fromtimestamp(psutil.boot_time ()).strftime("%Y-%m-%d %H: %M: %S")
'2017-06-05 15: 26: 07'
>>>
3.查看单个进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
4.用脚本的方式获取系统基本信息
import psutil
#Python中绘制出好看表格的模块
import prettytable
print("物理CPU个数",psutil.cpu_count(logical=False))
print("逻辑CPU个数",psutil.cpu_count())
print(psutil.cpu_percent())
print("*****************内存信息**********************")
memory = psutil.virtual_memory()
print("总内存大小:",memory.total)
print("已使用内存大小:",memory.used)
print("内存使用率:",memory.percent,'%')
print("*****************磁盘信息**********************")
#实例化对象,并通过filed.name属性设置表格的表头信息
pt = prettytable.PrettyTable(field_names=["分区名称","挂载点","文件系统类型" ,"属性","磁盘总容量","磁盘使用百分比(单位:%)"])
parts = psutil.disk_partitions()
for part in parts:
#print(part.device,part.mountpoint,part.fstype,part.opts)
usage = psutil.disk_usage(part)
pt.add_row([part.device,part.mountpoint,part.fstype,part.opts,usage.total,usage.percent])
print(pt)
5.python中时间模块的使用
获取当前时间 获取开机时长
from datetime import date, datetime,timedelta
import time
start_time =datetime(year=2020,month=10,day=10,hour=10,minute=10,second=0)
end_time =datetime(year=2020,month=10,day=11,hour=19,minute=15,second=0)
print(end_time-start_time)
import psutil
#获取系统开机时间
boot_time = psutil.boot_time()
boot_time = datetime.fromtimestamp(boot_time)
#获取当前时间
now_time = datetime.fromtimestamp(time.time())
print(boot_time,now_time)
print("开机时长:",now_time-boot_time)
获取系统信息
"""
主机名:
操作系统:
内核名称:
发行版本号:
内核版本
系统架构
当前时间
开机时间
开机时长
"""
# os模块, operate system, 跟操作系统相关的方法, 多是文件操作等
import os
import platform
from datetime import datetime
import time
try:
# os.uname在windows系统中不能执行 需要进行异常处理
system_info = os.uname()
except Exception as e:
system_info = platform.uname()
#获取系统开机时间 用到psutil timedate time 模块
import psutil
#获取的是开机时间的时间戳
boot_time = psutil.boot_time()
#将开机时间转化为字符串时间
boot_time = datetime.fromtimestamp(boot_time)
now_time = datetime.fromtimestamp(time.time())
print("""
***********************************主机信息监控********************************
主机名: %s
操作系统: %s
内核名称: %s
发行版本号: %s
内核版本: %s
系统架构: %s
当前时间: %s
开机时间: %s
开机时长: %s
""" %(system_info.node, system_info.system, system_info.system,
system_info.release, system_info.version, system_info.machine,
now_time, boot_time, now_time-boot_time
))