进阶语法-系统资源监控与数据采集
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、内存、磁盘、网络和进程信息。
一句话优点 :替代 ps、top、free 等命令行工具,统一 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:服务器 IPpassword:登录密码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:从远程服务器下载到本地(执行脚本的机器)
- 功能作用:实现远程服务器间的文件上传与下载,适用于自动化备份和文件分发场景