Python之psutil

psutil

简介psutil是一个跨平台(http://code.google.com/p/psutil),能够轻松实现获取系统运行的进程和系统利用率包括(保存CPU、内存、磁盘、网络等)信息。它实现了同等命令行工具提供的功能,如pstoplsofnetstatifconfigwhodfkillfreeniceioniceiostatiotopuptimepidofttytasksetpmap

安装

https://www.cnblogs.com/liu-yao/p/5678157.html

yum install -y python-pip

功能函数

  • CPU相关
  • Memory内存相关
  • Disk相关
  • Network相关
  • 进程管理

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
# 查看cpu个数
psutil.cpu_count() # 2
psutil.cpu_count(logical=True) # 2
psutil.cpu_count(logical=False) # 2
# 查看cpu利用率
psutil.cpu_percent() # 0.8
psutil.cpu_percent(percpu=True) # [0.8, 0.7]
# 查看cpu时间花费
psutil.cpu_times() # scputimes(user=96.72, nice=0.09, system=97.48, idle=45351.82, iowait=8.11, irq=0.0, softirq=5.15, steal=0.0, guest=0.0, guest_nice=0.0)

psutil.cpu_times(percpu=True) 
# [scputimes(user=45.88, nice=0.07, system=50.23, idle=22705.37, iowait=0.48, irq=0.0, softirq=1.89, steal=0.0, guest=0.0, guest_nice=0.0),scputimes(user=50.93, nice=0.01, system=47.35, idle=22670.42, iowait=7.62, irq=0.0, softirq=3.26, steal=0.0, guest=0.0, guest_nice=0.0)]

cpu_time = psutil.cpu_times()
cpu_time.user # 97.99 根据cpu_time获取响应的值

Memory

virtual_memory():以命名元组的形式返回内存使用情况,包括总内存,可用内存,内存利用率,buffer和cache等。单位为字节。

psutil.virtual_memory() # svmem(total=4125122560L, available=3663482880L, percent=11.2, used=1014362112L, free=3110760448L, active=458932224, inactive=325615616, buffers=2125824L, cached=550596608)

swap_memory():以命名元组的形式返回swap/memory使用情况,包含swap中页的换入和换出。

psutil.swap_memory() # sswap(total=1073737728L, used=0L, free=1073737728L, percent=0.0, sin=0, sout=0)

单位转换

import psutil
def bytes2human(n):
     symbols = ('K','M','G','T','P','E','Z','Y')
     prefix = {}
     for i,s in enumerate(symbols):
         prefix[s] = 1 << (i + 1) * 10
     for s in reversed(symbols):
         if n >= prefix[s]:
             value = float(n) / prefix[s]
             return '%.1f%s' % (value,s)
     return '%sB' % n
print bytes2human(psutil.virtual_memory().total)

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所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。

示例

# 查看所有已挂在的磁盘
psutil.disk_partitions() #[sdiskpart(device='/dev/sda3', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'),sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]
# 使用列表表达式查询指定挂载点信息
[device for device in psutil.disk_partitions() if device.mountpoint == '/']
# [sdiskpart(device='/dev/sda3', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]
# 查看磁盘使用情况
psutil.disk_usage('/') #sdiskusage(total=20179845120, used=2114883584, free=18064961536, percent=10.5)
# 查看磁盘io统计汇总
psutil.disk_io_counters() #sdiskio(read_count=5964, write_count=35722, read_bytes=249860608, write_bytes=629057536, read_time=3929, write_time=108205)
# 分别列出单个磁盘的统计信息
psutil.disk_io_counters(perdisk=True)
# 输出结果
{'sda1': sdiskio(read_count=508, write_count=519, read_bytes=5687808, write_bytes=2117632, read_time=88, write_time=69),
 'sda2': sdiskio(read_count=52, write_count=0, read_bytes=2265088, write_bytes=0, read_time=19, write_time=0),
 'sda3': sdiskio(read_count=5404, write_count=35240, read_bytes=241907712, write_bytes=627201024, read_time=3822, write_time=108206),
 'sr0': sdiskio(read_count=0, write_count=0, read_bytes=0, write_bytes=0, read_time=0, write_time=0)}

Network

函数 详情
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。
psutil.users() 以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端,与主机信息
psutil.boot_time() 以时间戳的形式返回系统的启动时间

示例

# 查看网卡信息统计
psutil.net_io_counters() # snetio(bytes_sent=2436593, bytes_recv=86547298, packets_sent=29381, packets_recv=66642, errin=0, errout=0, dropin=0, dropout=0)
# 查看网卡配置信息
psutil.net_if_addrs()
a = psutil.net_if_addrs()
a['eth0']
# 查看当前登录用户信息
psutil.users() # [suser(name='root', terminal='tty1', host='', started=1591149568.0),
 suser(name='root', terminal='pts/0', host='192.168.8.1', started=1591149568.0),
 suser(name='root', terminal='pts/1', host='192.168.8.1', started=1591149824.0)]

进程管理

函数 详情
psutil.pids() 以列表的形式返回当前正在运行的进程
psutil.pid_exists(1) 判断给点定的pid是否存在
psutil.process_iter() 迭代当前正在运行的进程,返回的是每个进程的Process对象
psutil.Process() 对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号

进程相关信息的方法

  • name:获取进程的名称
  • cmdline:获取启动进程的命令行参数
  • create_time:获取进程的创建时间(时间戳格式)
  • num_fds:进程打开的文件个数
  • num_threads:进程的子进程个数
  • is_running:判断进程是否正在运行
  • send_signal:给进程发送信号,类似与os.kill等
  • kill:发送SIGKILL信号结束进程
  • terminate:发送SIGTEAM信号结束进程

示例

# 以列表形式查看正在运行的进程
psutil.pids() # [1,2,3,5,7,8,9,10,11,12,13,14,...
# 查看进程运行状态,以布尔形式显示
psutil.pid_exists(1) # True
# 迭代当前正在运行进程,查看列表中前三个实例的信息
list(psutil.process_iter())[:3] #  [<psutil.Process(pid=1, name='systemd') at 139918970276112>,<psutil.Process(pid=2, name='kthreadd') at 139918970317904>,<psutil.Process(pid=3, name='ksoftirqd/0') at 139918970214416>]
# 通过进程号实例化对象
process = psutil.Process(1) # <psutil.Process(pid=1, name='systemd') at 139918970212944>
# 获取进程的名称
process.name() # 'systemd'
process.create_time() # 1591149592.13
process.num_fds() # 41
process.num_threads() # 1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343