进阶语法-系统资源监控与数据采集1.Pycharm配置Python远程解析器]# mkdir /root/pythonProject]# 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()importpsutil# 获取 CPU 总使用率1 秒间隔cpu_usagepsutil.cpu_percent(interval1)print(CPU Usage:,cpu_usage,%) 代码总结核心知识点使用psutil库获取系统 CPU 使用率实现逻辑调用psutil.cpu_percent(interval1)采集 1 秒间隔内的平均 CPU 使用率打印结果关键语法import psutil导入第三方库、psutil.cpu_percent(interval秒数)采集 CPU 占用百分比参数说明interval参数指定采样间隔时间确保获取相对稳定的 CPU 使用率功能作用实现系统性能监控的基础数据采集3.psutil模块获取多核CPU使用率cpu_count() psutil.cpu_count() -- 获取CPU核数 psutil.cpu_percent(interval1, percpuTrue) -- 获取CPU使用率返回一个列表列表中每个元素代表一个CPU核的使用率 importpsutilforiinrange(psutil.cpu_count()):print(f第{i1}个CPU核心使用率{psutil.cpu_percent(interval1,percpuTrue)[i]}) 代码总结核心知识点psutil获取 CPU 核心数量及每个核心的使用率实现逻辑psutil.cpu_count()获取 CPU 核心总数通过for循环遍历每个核心调用psutil.cpu_percent(interval1, percpuTrue)返回的列表取对应索引的值作为该核心使用率关键语法percpuTrue参数返回每个核心的使用率列表、range(cpu_count())生成索引范围、通过索引访问列表元素注意事项psutil.cpu_percent()每次调用都会重新采集数据建议将结果先存入变量再遍历使用避免重复采集造成性能损耗功能作用实现多核 CPU 系统的详细性能监控输出各核心的独立负载情况4.psutil模块获取物理内存virtual_memory()及swap内存swap_memory()信息importpsutil memory_infopsutil.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_infopsutil.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模块获取磁盘信息importpsutil# 获取所有磁盘分区forpartitionsinpsutil.disk_partitions(): print(f磁盘设备{partitions.device} 挂载点{partitions.mountpoint} 文件类型{partitions.fstype})# 获取磁盘使用情况disk_usage(磁盘路径)disk_usagepsutil.disk_usage(/)print(f/根分区 - 总磁盘大小{disk_usage.total:.2f}G%)print(f/根分区 - 已使用磁盘大小{disk_usage.used:.2f}G%)print(f/根分区 - 磁盘使用率{disk_usage.percent}%)6.psutil获取磁盘IO信息importtimeimportpsutil# 获取磁盘 IO信息disk_io_1psutil.disk_io_counters()# 休眠 10Stime.sleep(10)# 获取磁盘 IO信息disk_io_2psutil.disk_io_counters()# 获取磁盘吞吐量read_bytesdisk_io_2.read_bytes - disk_io_1.read_bytes write_bytesdisk_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信息importpsutil# 获取网络IO信息net_iopsutil.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吞吐量# 监听 9999 端口将接收到的数据丢入 /dev/null模拟接收[rootnode1 ~]# nc -l -p 9999 /dev/null [1]5330# 产生约 500MB 的数据流发送给本机 9999 端口这里的 sleep 是为了让你有时间启动 Python 脚本观察数据[rootnode1 ~]# dd if/dev/zero bs1M count500 | nc 127.0.0.1 99995000 recordsin5000 records out524288000bytes(524MB,500MiB)copied,0.710805s,738MB/simportpsutilimporttime net_io_1psutil.net_io_counters()time.sleep(1)net_io_2psutil.net_io_counters()send_bytesnet_io_2.bytes_sent-net_io_1.bytes_sent recv_bytesnet_io_2.bytes_recv-net_io_1.bytes_recvprint(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模块获取网卡信息importpsutil net_if_addrspsutil.net_if_addrs()# 获取网卡信息# print(net_if_addrs) #-- 可以自行查看信息forinterface_name,interface_addressinnet_if_addrs.items():print(f网卡名称{interface_name})print(f网卡地址{interface_address[0].address})print(f-*90)10.psutil模块获取cpu使用率并结合邮件告警importpsutilimportsmtplibfromemail.mime.textimportMIMETextfromemail.headerimportHeader from_addrxxxxxxx163.com# 发件方to_addrxxxxxxxqq.com# 收件方auth_codexxxxxxxxxxx# 授权码cpu_usagepsutil.cpu_percent(interval1)# 获取 CPU 使用率ifcpu_usage80:subject警告CPU使用率过高超过了阈值80%messagefCPU使用率过高超过了阈值80%当前CPU使用率为{cpu_usage}%msgMIMEText(message,plain,utf-8)msg[Subject]Header(subject,utf-8)msg[From]from_addr msg[To]to_addr smtp_serversmtplib.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(邮件发送成功)~]# yum install -y stress-ng~]# stress-ng --cpu 4 --timeout 60s11.paramiko模块实现远程登录并执行命令paramiko主要用于实现远程登录、文件上传与下载功能~]# pip install paramiko -i https://pypi.tuna.tsinghua.edu.cn/simpleimportparamiko# 创建SSHClient对象sshparamiko.SSHClient()# 首次连接会进行指纹确认提示输入yes表示允许连接我们可以忽略掉这个信息不输入yesssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接远程服务器 172.25.254.12:22ssh.connect(172.25.254.12,usernameroot,passwordroot)# 执行命令获取返回结果stdin,stdout,stderrssh.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模块实现远程登录并执行命令函数版importparamikodefssh_exec(hostname,password,cmd,port22,usernameroot):# 创建SSHClient对象sshparamiko.SSHClient()# 允许不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 链接服务器ssh.connect(hostnamehostname,portport,usernameusername,passwordpassword)stdin,stdout,stderrssh.exec_command(cmd)# 返回最终结果print(stdout.read().decode())print(stderr.read().decode())ssh.close()# 单词调用调用函数# ssh_exec(172.25.254.12,root,ls -l /mnt,22)whileTrue:cmdinput([rootnode2 ~]# )ssh_exec(172.25.254.12,root,cmd) 代码总结核心知识点将 SSH 远程执行逻辑封装为函数配合循环实现交互式远程命令执行实现逻辑定义ssh_exec()函数封装连接、执行、关闭流程while True循环接收用户输入的命令调用函数在远程服务器执行关键语法函数默认参数port22,usernameroot、函数调用传参、input()获取命令函数参数说明hostname服务器 IPpassword登录密码cmd待执行命令portSSH 端口默认22username用户名默认 root注意事项循环中没有退出条件需通过CtrlC或添加exit/quit判断来退出功能作用模拟简易的远程 Shell 工具实现持续的远程命令执行13.paramiko模块实现免密登录~]# ssh-keygen~]# ssk-copy-id xxxxxx~]# ll /root/.ssh/id_ed25519-rw-------1root root399May723:32 /root/.ssh/id_ed25519importparamiko sshparamiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 老版openssh - paramiko.RSAKey.from_private_key_file(/root/.ssh/id_RSA)private_keyparamiko.Ed25519Key.from_private_key_file(/root/.ssh/id_ed25519)ssh.connect(172.25.254.12,usernameroot,pkeyprivate_key)stdin,stdout,stderrssh.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适用于新版 OpenSSHEd25519 算法RSAKey适用于旧版 OpenSSHRSA 算法代码注释中展示了 RSA 用法安全优势密钥认证比密码认证更安全无需在网络中传输明文密码功能作用实现无密码的自动化远程认证适用于脚本和自动化运维场景14.paramiko模块实现上传与下载importparamiko# 创建传输连接transparamiko.Transport((172.25.254.11,22))# 使用账号密码连接node1服务器trans.connect(usernameroot,passwordroot)# 创建sftp对象实现上传与下载sftpparamiko.SFTPClient.from_transport(trans)sftp.put(/etc/passwd,/tmp/passwd.bak)# 上传文件(本地文件路径,远程目标文件路径)sftp.get(/etc/shadow,/mnt/shadow.bak)# 下载文件(远程目标文件路径,本地文件路径)trans.close()15.paramiko模块实现上传与下载免密版importparamiko transparamiko.Transport((172.25.254.12,22))private_keyparamiko.Ed25519Key.from_private_key_file(/root/.ssh/id_ed25519)trans.connect(usernameroot,pkeyprivate_key)sftpparamiko.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从远程服务器下载到本地执行脚本的机器功能作用实现远程服务器间的文件上传与下载适用于自动化备份和文件分发场景