【Python专项】进阶语法-系统资源监控与数据采集(1)

进阶语法-系统资源监控与数据采集

1.Pycharm配置Python远程解析器

bash 复制代码
]# mkdir /root/pythonProject
bash 复制代码
]# dnf install -y python3-pip
]# pip install psutil -i https://pypi.tuna.tsinghua.edu.cn/simple

开源地址https://github.com/giampaolo/psutil

官网https://psutil.readthedocs.io/stable/

psutil 是一个跨平台的 Python 系统监控库,能让你用几行代码获取 CPU、内存、磁盘、网络和进程信息。

一句话优点 :替代 pstopfree 等命令行工具,统一 API,代码更简洁。

2.psutil模块获取单个CPU使用率cpu_percent()

bash 复制代码
import psutil

# 获取 CPU 总使用率,1 秒间隔
cpu_usage = psutil.cpu_percent(interval=1)
print('CPU Usage:',cpu_usage,'%')

📝 代码总结

  • 核心知识点 :使用 psutil 库获取系统 CPU 使用率
  • 实现逻辑 :调用 psutil.cpu_percent(interval=1) 采集 1 秒间隔内的平均 CPU 使用率,打印结果
  • 关键语法import psutil 导入第三方库、psutil.cpu_percent(interval=秒数) 采集 CPU 占用百分比
  • 参数说明interval 参数指定采样间隔时间,确保获取相对稳定的 CPU 使用率
  • 功能作用:实现系统性能监控的基础数据采集

3.psutil模块获取多核CPU使用率cpu_count()

python 复制代码
"""
psutil.cpu_count()  --> 获取CPU核数
psutil.cpu_percent(interval=1, percpu=True) --> 获取CPU使用率,返回一个列表,列表中每个元素代表一个CPU核的使用率
"""
import psutil

for i in range(psutil.cpu_count()):
    print(f'第{i+1}个CPU核心使用率:{psutil.cpu_percent(interval=1,percpu=True)[i]}')

📝 代码总结

  • 核心知识点psutil 获取 CPU 核心数量及每个核心的使用率
  • 实现逻辑psutil.cpu_count() 获取 CPU 核心总数;通过 for 循环遍历每个核心,调用 psutil.cpu_percent(interval=1, percpu=True) 返回的列表,取对应索引的值作为该核心使用率
  • 关键语法percpu=True 参数返回每个核心的使用率列表、range(cpu_count()) 生成索引范围、通过索引访问列表元素
  • 注意事项psutil.cpu_percent() 每次调用都会重新采集数据,建议将结果先存入变量再遍历使用,避免重复采集造成性能损耗
  • 功能作用:实现多核 CPU 系统的详细性能监控,输出各核心的独立负载情况

4.psutil模块获取物理内存virtual_memory()swap内存swap_memory()信息

python 复制代码
import psutil

memory_info = psutil.virtual_memory()
print(f'总物理内存:{memory_info.total / 1024 ** 3:.2f}G')
print(f'已使用物理内存:{memory_info.used / 1024 ** 3:.2f}G')
print(f'未使用物理内存:{memory_info.available / 1024 ** 3:.2f}G')
print(f'物理内存使用率:{memory_info.percent}%')
print('@' * 20)
swap_info = psutil.swap_memory()
print(f'总交换内存:{swap_info.total / 1024 ** 3:.2f}G')
print(f'已使用交换内存:{swap_info.used / 1024 ** 3:.2f}G')
print(f'未使用交换内存:{swap_info.free / 1024 ** 3:.2f}G')
print(f'交换内存使用率:{swap_info.percent}%')

📝 代码总结

  • 核心知识点psutil 获取物理内存与交换内存信息
  • 实现逻辑 :分别调用 psutil.virtual_memory()psutil.swap_memory() 获取内存统计对象,提取 total、used、available/free、percent 属性,转换为 GB 单位并格式化输出
  • 关键语法1024 ** 3 字节转 GB、:.2f 保留两位小数、字符串分隔线 '@' * 20
  • 属性对比
    • 物理内存使用 available 表示可用内存
    • 交换内存使用 free 表示未使用内存
  • 功能作用:全面监控系统内存资源,同时查看物理内存和交换分区(虚拟内存)的使用情况

5.pstui模块获取磁盘信息

bash 复制代码
import psutil

# 获取所有磁盘分区
for partitions in psutil.disk_partitions():
    print(f'磁盘设备:{partitions.device}  挂载点:{partitions.mountpoint}  文件类型:{partitions.fstype}')

# 获取磁盘使用情况,disk_usage(磁盘路径)
disk_usage = psutil.disk_usage('/')
print(f'/根分区 -> 总磁盘大小:{disk_usage.total:.2f}G%')
print(f'/根分区 -> 已使用磁盘大小:{disk_usage.used:.2f}G%')
print(f'/根分区 -> 磁盘使用率:{disk_usage.percent}%')

6.psutil获取磁盘IO信息

bash 复制代码
import time
import psutil

# 获取磁盘 IO信息
disk_io_1 = psutil.disk_io_counters()
# 休眠 10S
time.sleep(10)
# 获取磁盘 IO信息
disk_io_2 = psutil.disk_io_counters()
# 获取磁盘吞吐量
read_bytes = disk_io_2.read_bytes - disk_io_1.read_bytes
write_bytes = disk_io_2.write_bytes - disk_io_1.write_bytes

print(f'磁盘读取吞吐量:{read_bytes / (1024 ** 2)}MB/s')
print(f'磁盘写入吞吐量:{write_bytes / (1024 ** 2)}MB/s')

📝 代码总结

  • 核心知识点 :使用 psutil 通过差值计算磁盘 I/O 吞吐量
  • 实现逻辑 :首次调用 psutil.disk_io_counters() 获取初始读写字节数,休眠 10 秒后再次获取,计算两次差值除以时间间隔得到每秒吞吐量
  • 关键语法time.sleep(秒数) 实现间隔采样、差值计算 第二次 - 第一次1024 ** 2 字节转 MB
  • 计算公式:吞吐量 = (后续字节数 - 初始字节数) / 间隔时间
  • 注意事项:计算结果单位为 MB/s,实际代码未除以时间间隔(10秒),输出值为 10 秒内的总读写量而非每秒速率
  • 功能作用:监控磁盘读写速率,评估系统磁盘 I/O 性能

7.psutil获取网络IO信息

python 复制代码
import psutil

# 获取网络IO信息
net_io = psutil.net_io_counters()
print(f'发送字节数:{net_io.bytes_sent}')
print(f'接收字节数:{net_io.bytes_recv}')

📝 代码总结

  • 核心知识点psutil.net_io_counters() 获取网络 I/O 统计信息
  • 实现逻辑 :调用 psutil.net_io_counters() 获取网络接口的累计收发数据量,分别输出发送和接收的字节数
  • 关键语法net_io.bytes_sent 获取发送字节数、net_io.bytes_recv 获取接收字节数
  • 数据特性:返回的是系统启动以来的累计值,非实时速率
  • 功能作用:实现网卡流量监控的基础数据采集,可用于计算网络带宽使用率或流量统计

8.psutil模块获取网络IO吞吐量

bash 复制代码
# 监听 9999 端口,将接收到的数据丢入 /dev/null(模拟接收)
[root@node1 ~]# nc -l -p 9999 > /dev/null &
[1] 5330

# 产生约 500MB 的数据流发送给本机 9999 端口,这里的 sleep 是为了让你有时间启动 Python 脚本观察数据
[root@node1 ~]# dd if=/dev/zero bs=1M count=500 | nc 127.0.0.1 9999
500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 0.710805 s, 738 MB/s
python 复制代码
import psutil
import time

net_io_1 = psutil.net_io_counters()
time.sleep(1)
net_io_2 = psutil.net_io_counters()

send_bytes = net_io_2.bytes_sent - net_io_1.bytes_sent
recv_bytes = net_io_2.bytes_recv - net_io_1.bytes_recv
print(f'网络IO发送的吞吐量:{send_bytes / (1024 ** 2)}MB/s')
print(f'网络IO接收的吞吐量:{recv_bytes / (1024 ** 2)}MB/s')

📝 代码总结

  • 核心知识点:通过差值计算网络 I/O 实时吞吐量
  • 实现逻辑 :首次调用 psutil.net_io_counters() 获取初始收发字节数,间隔 1 秒后再次获取,计算两次差值得到每秒传输量,转换为 MB/s 输出
  • 关键语法time.sleep(1) 固定采样间隔、差值计算 第二次 - 第一次1024 ** 2 字节转 MB
  • 计算公式:吞吐量(MB/s) = (后续字节数 - 初始字节数) / 间隔秒数 / 1024²
  • 注意事项:此代码输出的是 1 秒内的平均速率,采样间隔可根据需求调整
  • 功能作用:实时监控网卡上传/下载速率,评估网络带宽使用情况

9.psutil模块获取网卡信息

python 复制代码
import psutil

net_if_addrs = psutil.net_if_addrs()    # 获取网卡信息
# print(net_if_addrs) #--> 可以自行查看信息

for interface_name,interface_address in net_if_addrs.items():
    print(f'网卡名称:{interface_name}')
    print(f'网卡地址:{interface_address[0].address}')
    print(f'-' * 90)

10.psutil模块获取cpu使用率并结合邮件告警

python 复制代码
import psutil
import smtplib
from  email.mime.text import MIMEText
from  email.header import Header

from_addr = 'xxxxxxx@163.com'   # 发件方
to_addr = 'xxxxxxx@qq.com'       # 收件方
auth_code = 'xxxxxxxxxxx'      # 授权码

cpu_usage = psutil.cpu_percent(interval=1)     # 获取 CPU 使用率

if cpu_usage >= 80:
    subject = '警告!CPU使用率过高,超过了阈值80%!'
    message = f'CPU使用率过高,超过了阈值80%,当前CPU使用率为{cpu_usage}%'
    msg = MIMEText(message, 'plain','utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = from_addr
    msg['To'] = to_addr

    smtp_server = smtplib.SMTP_SSL('smtp.163.com',465)
    smtp_server.login(from_addr, auth_code)

    smtp_server.sendmail(from_addr, to_addr, msg.as_string())
    smtp_server.quit()
    print('邮件发送成功!')
bash 复制代码
~]# yum install -y stress-ng
~]# stress-ng --cpu 4 --timeout 60s

11.paramiko模块实现远程登录并执行命令

paramiko主要用于实现(远程登录)、(文件上传)与(下载功能)

bash 复制代码
~]# pip install paramiko -i https://pypi.tuna.tsinghua.edu.cn/simple
python 复制代码
import paramiko
# 创建SSHClient对象
ssh = paramiko.SSHClient()
# 首次连接,会进行指纹确认,提示输入yes,表示允许连接,我们可以忽略掉这个信息,不输入yes
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接远程服务器 172.25.254.12:22
ssh.connect('172.25.254.12', username='root', password='root')
# 执行命令,获取返回结果
stdin,stdout,stderr = ssh.exec_command('touch /tmp/test.txt')
# 返回最终结果
print(stdout.read().decode())
print(stderr.read().decode())
# 关闭ssh连接
ssh.close()

📝 代码总结

  • 核心知识点 :使用 paramiko 库实现 SSH 远程连接并执行命令
  • 实现逻辑 :创建 SSHClient 对象 → 设置自动添加主机密钥策略 → 连接远程服务器(IP、用户名、密码)→ 执行命令 touch /tmp/test.txt → 读取输出结果 → 关闭连接
  • 关键语法
    • set_missing_host_key_policy(paramiko.AutoAddPolicy()) 自动接受未知主机密钥
    • ssh.connect(ip, username, password) 认证连接
    • exec_command(命令) 执行远程命令,返回三管道对象
    • stdout.read().decode() 读取标准输出并解码
    • stderr.read().decode() 读取错误输出
  • 管道说明stdin 用于输入、stdout 接收正常输出、stderr 接收错误信息
  • 注意事项:生产环境建议使用密钥认证替代明文密码
  • 功能作用:自动化远程运维,批量执行服务器命令

12.paramiko模块实现远程登录并执行命令(函数版)

python 复制代码
import paramiko

def ssh_exec(hostname,password,cmd,port=22,username="root"):
    # 创建SSHClient对象
    ssh = paramiko.SSHClient()
    # 允许不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 链接服务器
    ssh.connect(hostname=hostname,port=port,username=username,password=password)
    stdin, stdout, stderr = ssh.exec_command(cmd)
    # 返回最终结果
    print(stdout.read().decode())
    print(stderr.read().decode())

    ssh.close()

# 单词调用调用函数
# ssh_exec("172.25.254.12","root","ls -l /mnt",22)

while True:
    cmd = input('[root@node2 ~]# ')
    ssh_exec('172.25.254.12','root',cmd)

📝 代码总结

  • 核心知识点:将 SSH 远程执行逻辑封装为函数,配合循环实现交互式远程命令执行
  • 实现逻辑 :定义 ssh_exec() 函数封装连接、执行、关闭流程;while True 循环接收用户输入的命令,调用函数在远程服务器执行
  • 关键语法 :函数默认参数(port=22, username="root")、函数调用传参、input() 获取命令
  • 函数参数说明
    • hostname:服务器 IP
    • password:登录密码
    • cmd:待执行命令
    • port:SSH 端口(默认22)
    • username:用户名(默认 root)
  • 注意事项 :循环中没有退出条件,需通过 Ctrl+C 或添加 exit/quit 判断来退出
  • 功能作用:模拟简易的远程 Shell 工具,实现持续的远程命令执行

13.paramiko模块实现免密登录

bash 复制代码
~]# ssh-keygen
~]# ssk-copy-id xxx@xxx
~]# ll /root/.ssh/id_ed25519
-rw------- 1 root root 399 May  7 23:32 /root/.ssh/id_ed25519
python 复制代码
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 老版openssh -> paramiko.RSAKey.from_private_key_file('/root/.ssh/id_RSA')
private_key = paramiko.Ed25519Key.from_private_key_file('/root/.ssh/id_ed25519')
ssh.connect('172.25.254.12', username='root', pkey=private_key)

stdin, stdout, stderr = ssh.exec_command('ls -l /root/.ssh/')
print(stdout.read().decode())
print(stderr.read().decode())

ssh.close()

📝 代码总结

  • 核心知识点 :使用 paramiko 通过密钥认证方式登录 SSH
  • 实现逻辑:创建 SSHClient → 设置自动接受主机密钥 → 读取本地私钥文件 → 使用私钥对象连接服务器 → 执行命令 → 关闭连接
  • 关键语法
    • paramiko.Ed25519Key.from_private_key_file(密钥路径) 读取 Ed25519 类型私钥
    • ssh.connect(pkey=私钥对象) 使用密钥认证替代密码认证
  • 密钥类型
    • Ed25519Key:适用于新版 OpenSSH(Ed25519 算法)
    • RSAKey:适用于旧版 OpenSSH(RSA 算法),代码注释中展示了 RSA 用法
  • 安全优势:密钥认证比密码认证更安全,无需在网络中传输明文密码
  • 功能作用:实现无密码的自动化远程认证,适用于脚本和自动化运维场景

14.paramiko模块实现上传与下载

python 复制代码
import paramiko

# 创建传输连接
trans = paramiko.Transport(('172.25.254.11',22))
# 使用账号密码连接node1服务器
trans.connect(username='root',password='root')
# 创建sftp对象,实现上传与下载
sftp = paramiko.SFTPClient.from_transport(trans)

sftp.put('/etc/passwd','/tmp/passwd.bak')    # 上传文件(本地文件路径,远程目标文件路径)
sftp.get('/etc/shadow','/mnt/shadow.bak')    # 下载文件(远程目标文件路径,本地文件路径)

trans.close()

15.paramiko模块实现上传与下载(免密版)

python 复制代码
import paramiko

trans = paramiko.Transport(('172.25.254.12',22))

private_key = paramiko.Ed25519Key.from_private_key_file('/root/.ssh/id_ed25519')
trans.connect(username='root',pkey=private_key)

sftp = paramiko.SFTPClient.from_transport(trans)

sftp.put('/root/anaconda-ks.cfg','/mnt/anaconda-ks.cfg.bak')	# 将172.25.254.11的上传到172.25.254.12下面
sftp.get('/etc/at.deny','/root/xxx.txt')        # 将172.25.254.12的下载到172.25.254.11下面

trans.close()

📝 代码总结

  • 核心知识点 :使用 paramiko 的 Transport 层实现 SFTP 文件传输
  • 实现逻辑 :创建 Transport 对象指定目标主机和端口 → 使用 Ed25519 私钥认证连接 → 通过 Transport 创建 SFTP 客户端 → 执行 put 上传和 get 下载操作 → 关闭连接
  • 关键语法
    • paramiko.Transport((host, port)) 创建传输层对象
    • SFTPClient.from_transport(trans) 从 Transport 对象构建 SFTP 客户端
    • sftp.put(本地路径, 远程路径) 上传文件
    • sftp.get(远程路径, 本地路径) 下载文件
  • 传输方向
    • put:从本地(执行脚本的机器)上传到远程服务器
    • get:从远程服务器下载到本地(执行脚本的机器)
  • 功能作用:实现远程服务器间的文件上传与下载,适用于自动化备份和文件分发场景
相关推荐
Le_ee1 小时前
ctfweb:php/php短标签/.haccess+图片马/XXE
开发语言·前端·php
苍煜2 小时前
Java开发IO零基础吃透:BIO、NIO、同步异步、阻塞非阻塞
java·python·nio
yong99902 小时前
MATLAB读取高光谱图像
开发语言·matlab
2zcode2 小时前
基于MATLAB的肝病风险评估与分期分析系统设计与实现
开发语言·matlab
小小de风呀2 小时前
de风——【从零开始学C++】(五):内存管理
开发语言·c++
ooseabiscuit2 小时前
Laravel6.x核心优化与特性全解析
android·开发语言·javascript
折哥的程序人生 · 物流技术专研2 小时前
Java面试85题图解版(一):基础核心篇
java·开发语言·后端·面试
AllData公司负责人3 小时前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
Hello.Reader3 小时前
算法基础(十)——分治思想把大问题拆成小问题
java·开发语言·算法