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'