介绍
我们可以通过top
、free
、iostat
、ps
等命令获取服务器的内存、CPU、网络、进程等信息。Python可以通过使用subprocess
模块去执行命令获取这些信息,不过需要写额外的解析代码。
psutil
库提供这些系统信息,psutil = process and system utilities
,可以跨平台使用获取CPU、内存、磁盘、网络、传感器
等信息。
可以通过pip install psutil
来安装该模块。
简单使用
下面代码可以在windows上运行,也可以在linux上运行
# -*- coding:UTF-8 -*-
"""
psutil使得Python程序获取系统信息变得易如反掌。
psutil还可以获取用户信息、Windows服务等很多有用的系统信息,具体请参考psutil的官网:https://github.com/giampaolo/psutil
"""
import psutil
import os
import sys
from pprint import pprint
# 获取CPU信息
cpu_ct = psutil.cpu_count()
print("逻辑CPU个数:", cpu_ct)
cpu_pysical_ct = psutil.cpu_count(logical=False)
print("物理CPU个数:", cpu_pysical_ct)
print("根据上面的结果可推出其超线程数是:", int(cpu_pysical_ct / cpu_ct))
cpu_times = psutil.cpu_times()
print("统计CPU的用户/系统/空闲时间", cpu_times)
# 等价于 top -n 3 -d 5
for i in range(3):
# 获取CPU使用百分比信息
cpu_percent = psutil.cpu_percent(interval=5, percpu=False)
print(cpu_percent)
# 获取内存信息
virtual_memory = psutil.virtual_memory()
# 物理内存
print("virtual_memory:", virtual_memory)
swap_memory = psutil.swap_memory()
# 交换内存
print("swap_memory:", swap_memory)
# 获取磁盘信息
disk_partitions = psutil.disk_partitions()
pprint(disk_partitions)
# 获取磁盘的使用情况,需要指定磁盘的挂载目录
disk_usage = psutil.disk_usage("/")
print(disk_usage)
# 获取磁盘IO统计数据 如果指定perdisk=True则返回每个磁盘的统计数据
disk_io_counters = psutil.disk_io_counters(perdisk=True)
print(disk_io_counters)
# 获取网络信息
net_io_counters = psutil.net_io_counters()
# 获取网络读写字节/包的个数
print(net_io_counters)
# 获取网络接口信息
net_if_addrs = psutil.net_if_addrs()
pprint(net_if_addrs)
# 获取网络接口状态
net_if_stats = psutil.net_if_stats()
pprint(net_if_stats)
# 获取当前网络连接信息
net_connections = psutil.net_connections()
pprint(net_connections)
# 获取进程信息
# 返回的是进程id的列表
pids = psutil.pids()
print("当前运行的进程个数:", len(pids))
# 获取当前进程id
p = psutil.Process(os.getpid())
print("进程名: ", p.name())
print("进程exe绝对路径: ", p.exe())
print("进程工作目录: ", p.cwd())
print("进程启动的命令行: ", p.cmdline())
print("父进程id: ", p.ppid())
print("父进程: ", p.parent())
print("子进程列表: ", p.children(recursive=False))
print("进程状态: ", p.status())
print("进程所属用户: ", p.username())
print("进程启动时间戳: ", p.create_time())
from datetime import datetime
datetime.fromtimestamp(p.create_time())
# 判断是linux才查看进程终端,windows上会报错
if sys.platform == "linux":
print("进程终端: ", p.terminal())
print("进程使用的CPU时间: ", p.cpu_times())
print("进程使用的内存: ", p.memory_info())
# 进程使用的内存: pmem(rss=77926400, vms=1930043392, shared=5652480, text=2482176, lib=0, data=1716023296, dirty=0)
# ============================================================
# | FIELD | DESCRIPTION | AKA | TOP |
# ============================================================
# | rss | resident set size | | RES |
# | vms | total program size | size | VIRT |
# | shared | shared pages (from shared mappings) | | SHR |
# | text | text ('code') | trs | CODE |
# | lib | library (unused in Linux 2.6) | lrs | |
# | data | data + stack | drs | DATA |
# | dirty | dirty pages (unused in Linux 2.6) | dt | |
# ============================================================
print("进程打开的文件: ", p.open_files())
print("进程相关网络连接: ", p.connections())
print("进程的线程数量: ", p.num_threads())
# 所有线程信息
pprint(p.threads())
print("进程环境变量: ", p.environ())
# 模拟ps效果
psutil.test()
# 结束进程
print("即将自动结束进程")
p.terminate()
进阶和参考网址
更多详细的信息可以参考psutil官网
廖雪峰老师Python教程