20. Python之psutil模块

1 模块简介

psutil主要用于获取系统信息
    进程信息
    系统利用率: cpu, 内存, 磁盘, 网络

1.1 安装

安装依赖
yum -y install gcc
yum -y install python3-devel # Python3
yum -y install python2-devel # Python2
pip3 install psutil

1.2 模块使用

python解释器
>>> import psutil
>>> psutil.virtual_memory()  
svmem(total=1019580416, available=718499840, percent=29.5, used=136396800, free=440393728, active=220209152, inactive=213209088, buffers=2129920, cached=440659968, shared=7970816, slab=84291584)
输出的结果是class类型, 通过.used(.key)去得到具体结果
>>> psutil.virtual_memory().percent
31.2
#!/usr/bin/python3                                                                                                                                                                  
import psutil
print(psutil.virtual_memory())
[23:57:05 root@python3 /data/python3]#python3 psutil_test.py 
svmem(total=1019580416, available=727904256, percent=28.6, used=130609152, free=449769472, active=242122752, inactive=193245184, buffers=2129920, cached=437071872, shared=7970816, slab=77086720)

2 获取系统信息

2.1 CPU

2.1.1 cpu基本信息

psutil.cpu_times()

>>> import psutil
>>> psutil.cpu_times()
scputimes(user=20.9, nice=0.0, system=20.8, idle=1270.82, iowait=0.44, irq=0.0, softirq=1.41, steal=0.0, guest=0.0, guest_nice=0.0)
获取逻辑cpu信息

>>> import psutil
>>> psutil.cpu_times(percpu=True)
[scputimes(user=21.27, nice=0.0, system=21.55, idle=1621.6, iowait=0.47, irq=0.0, softirq=1.46, steal=0.0, guest=0.0, guest_nice=0.0)]

2.1.2 cpu核数信息

获取cpu的逻辑个数
>>> psutil.cpu_count()
1
获取cpu的物理个数
>>> psutil.cpu_count(logical=False)
1

2.1.3 获取单项信息

>>> psutil.cpu_times().user  # 执行用户进程的时间百分比
21.42
>>> psutil.cpu_times().system # 执行内核进程和中断的时间百分比
21.89

2.2 内存

内存全部信息
>>> psutil.virtual_memory()
svmem(total=1019580416, available=727293952, percent=28.7, used=131186688, free=449019904, active=242778112, inactive=193265664, buffers=2129920, cached=437243904, shared=8003584, slab=77086720)
交换分区
>>> psutil.swap_memory()
sswap(total=2147479552, used=0, free=2147479552, percent=0.0, sin=0, sout=0)
获取内存空闲
>>> psutil.virtual_memory().free
394346496
获取内存总量
>>> psutil.virtual_memory().total
1019580416
获取缓冲
>>> psutil.virtual_memory().buffers
2129920
获取交互分区总量
>>> psutil.swap_memory().total
2147479552

获取交互分区空闲
>>> psutil.swap_memory().free
2147479552

2.3 网络

获取所有网卡的信息
>>> psutil.net_io_counters()
snetio(bytes_sent=2034636, bytes_recv=62711146, packets_sent=25070, packets_recv=52174, errin=0, errout=0, dropin=0, dropout=0)
按照网卡获取
>>> psutil.net_io_counters(pernic=True)
{'eth0': snetio(bytes_sent=2044584, bytes_recv=62723980, packets_sent=25181, packets_recv=52314, errin=0, errout=0, dropin=0, dropout=0), 'lo': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}
获取单个信息
>>> psutil.net_io_counters().packets_sent
25327
获取单个网卡信息
>>> psutil.net_io_counters('eth0')
{'eth0': snetio(bytes_sent=2091152, bytes_recv=62780247, packets_sent=25652, packets_recv=52887, errin=0, errout=0, dropin=0, dropout=0), 'lo': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}
>>> psutil.net_if_addrs() # 网卡地址信息
{'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:00:00:00:00:00', netmask=None, broadcast=None, ptp=None)], 'eth0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='10.0.0.187', netmask='255.255.255.0', broadcast='10.0.0.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::20c:29ff:fe54:b794%eth0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:0c:29:54:b7:94', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}
>>> psutil.net_if_stats() # 网卡状态信息
{'eth0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500), 'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536)}
>>> psutil.net_connections() # 连接信息
[sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=22), raddr=(), status='LISTEN', pid=804), sconn(fd=4, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::', port=22), raddr=(), status='LISTEN', pid=804), sconn(fd=14, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::1', port=25), raddr=(), status='LISTEN', pid=956), sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.187', port=22), raddr=addr(ip='10.0.0.1', port=59893), status='ESTABLISHED', pid=1190), sconn(fd=13, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=25), raddr=(), status='LISTEN', pid=956)]

2.4 磁盘

磁盘分区信息

>>> psutil.disk_partitions()
[sdiskpart(device='/dev/sda2', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota', maxfile=255, maxpath=4096), sdiskpart(device='/dev/sda5', mountpoint='/data', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota', maxfile=255, maxpath=4096), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota', maxfile=255, maxpath=4096)]

磁盘挂载点信息

>>> psutil.disk_usage('/')
sdiskusage(total=21464350720, used=1740574720, free=19723776000, percent=8.1)
>>> psutil.disk_usage('/boot')
sdiskusage(total=1063256064, used=137191424, free=926064640, percent=12.9)
>>> psutil.disk_usage('/data')
sdiskusage(total=28974780416, used=33824768, free=28940955648, percent=0.1)

磁盘io相关信息

>>> psutil.disk_io_counters() # 磁盘总的IO信息
sdiskio(read_count=11416, write_count=9528, read_bytes=240947712, write_bytes=337588736, read_time=7458, write_time=10129, read_merged_count=18, write_merged_count=878, busy_time=9172)
>>> psutil.disk_io_counters(perdisk=True) # 按照分区
{'sda': sdiskio(read_count=11398, write_count=9528, read_bytes=239895040, write_bytes=337588736, read_time=7432, write_time=10129, read_merged_count=18, write_merged_count=878, busy_time=9152), 'sda1': sdiskio(read_count=511, write_count=10, read_bytes=5701120, write_bytes=2117632, read_time=133, write_time=16, read_merged_count=0, write_merged_count=0, busy_time=136), 'sda2': sdiskio(read_count=10641, write_count=9464, read_bytes=227498496, write_bytes=333108736, read_time=7241, write_time=10042, read_merged_count=18, write_merged_count=869, busy_time=8955), 'sda3': sdiskio(read_count=52, write_count=0, read_bytes=2265088, write_bytes=0, read_time=11, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=8), 'sda4': sdiskio(read_count=6, write_count=0, read_bytes=18432, write_bytes=0, read_time=0, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=0), 'sda5': sdiskio(read_count=158, write_count=54, read_bytes=3338752, write_bytes=2362368, read_time=42, write_time=71, read_merged_count=0, write_merged_count=9, busy_time=81), 'sr0': sdiskio(read_count=18, write_count=0, read_bytes=1052672, write_bytes=0, read_time=26, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=20)}

总的IO写入量(获取某个单一数值, 只要加上变量即可)
>>> psutil.disk_io_counters().write_count
9528

2.5 其他

2.5.1 获取连接用户信息

>>> psutil.users()[0]
suser(name='root', terminal='pts/0', host='10.0.0.1', started=1613404160.0, pid=1192)
>>> type(psutil.users()[0])
<class 'psutil._common.suser'>
>>> psutil.users()
[suser(name='root', terminal='pts/0', host='10.0.0.1', started=1613404160.0, pid=1192)]
>>> type(psutil.users())
<class 'list'>
>>> psutil.users()[0]
suser(name='root', terminal='pts/0', host='10.0.0.1', started=1613404160.0, pid=1192)
结果是个列表, 列表中的每个元素都是连接的用户信息
suser(name='root', terminal='pts/0', host='10.0.0.1', started=1613404160.0, pid=1192)
>>> psutil.users()
[suser(name='root', terminal='pts/0', host='10.0.0.1', started=1613404160.0, pid=1192), suser(name='root', terminal='pts/1', host='10.0.0.1', started=1613409152.0, pid=26571)]
>>> psutil.users()[0]
suser(name='root', terminal='pts/0', host='10.0.0.1', started=1613404160.0, pid=1192)
>>> psutil.users()[1]
suser(name='root', terminal='pts/1', host='10.0.0.1', started=1613409152.0, pid=26571)

2.5.2 获取启动时间

>>> psutil.boot_time()
1613403604.0  默认结果是Unix时间
>>> time=psutil.boot_time()
使用datetime模块进行格式转换
>>> import datetime
>>> datetime.datetime.fromtimestamp(time).strftime("%F_%T")
'2021-02-15_23:40:04'

3 获取进程信息

3.1 psutil.pids() 和 psutil.Process()的使用

获取系统的所有进程id
>>> psutil.pids()  
[1, 2, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 30, 31, 32, 33, 41, 43, 44, 45, 47, 60, 95, 232, 233, 234, 235, 243, 244, 245, 246, 248, 249, 251, 254, 256, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 364, 385, 425, 426, 427, 428, 430, 431, 434, 435, 438, 439, 441, 442, 444, 445, 447, 448, 464, 468, 469, 471, 512, 535, 538, 539, 540, 543, 544, 550, 552, 804, 806, 807, 956, 964, 1151, 1190, 1192, 1409, 26544, 26568, 26571, 26590, 26592, 26616, 26618, 26638, 26640, 26644]
>>> pid=psutil.pids()
>>> len(pid)
107
判断指定的进程id是否存在

>>> psutil.pid_exists(111)
False
>>> psutil.pid_exists(10)
True
获取指定进程信息

>>> psutil.Process(1)
psutil.Process(pid=1, name='systemd', status='sleeping', started='23:40:04')
获取指定进程的某个信息
>>> psutil.Process(1).name
<bound method Process.name of psutil.Process(pid=1, name='systemd', status='sleeping', started='23:40:04')>
>>> psutil.Process(1).name()  要借助方法
'systemd'
执行路径
>>> psutil.Process(1).exe()
'/usr/lib/systemd/systemd'

创建时间
>>> psutil.Process(1).create_time()
1613403604.07

进程状态
>>> psutil.Process(1).status()
'sleeping'

3.2 Popen类的使用

psutil提供的Popen类的作用是获取用户启动的应用程序进程信息, 以便跟踪程序进程的运行状态.
通过手动创建命令, 传给PIPE, 来获取进程信息
>>> import psutil
>>> from subprocess import PIPE
>>> from subprocess import PIPE
>>> import psutil
>>> my_process=psutil.Popen(['/usr/bin/sleep','1'],stdout=PIPE)
>>> my_process.name() # name()返回程序名称 
'sleep'
>>> my_process.username() # username()返回程序启动用户
'root'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容