ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

树莓派本地监控系统搭建:Shell+Python实现CPU温度与内存使用率可视化

树莓派本地监控系统搭建:Shell+Python实现CPU温度与内存使用率可视化 简介本资源是一套面向树莓派初学者与课程设计实践者的轻量级系统监控解决方案适用于毕业设计、嵌入式开发实训及Linux系统运维入门学习聚焦CPU温度与内存使用两大核心指标的实时可视化监控。压缩包共16个文件672KB包含4个Python主控脚本负责数据采集与Flask服务启动、4个HTML前端页面含cpu.html、mem.html等独立视图、3个JavaScript文件基于CanvasJS实现动态图表渲染、1个Shell启动脚本main.sh及配套README、LICENSE与静态资源。已有153人下载学习资源结构清晰分层后端采集pi-monitor-cpu-temperature.py、pi-monitor-mem.py、Web服务pi-monitor-flask.py、前端模板templates/与静态资源static/职责分明附带可直接运行的demo.html与图像素材开箱即用便于理解嵌入式系统监控的数据流闭环与前后端协同逻辑。1. 项目概述与核心价值最近在折腾我的树莓派4B它现在承担着家庭NAS、智能家居中枢和一个小型Web服务器的重任。随着负载的增加我发现它偶尔会变得有点“烫手”风扇也开始呼呼作响。这让我意识到对于这种长期运行、资源有限的微型计算机系统监控不是可有可无的“花架子”而是保障其稳定运行的“生命体征仪”。一个简单的CPU温度监控和内存使用监控能让你在系统过热崩溃或内存泄漏导致服务中断前就提前发现问题及时干预。这个项目就是教你如何为你的树莓派搭建一套轻量、高效、可视化的本地监控系统。我们不会引入像PrometheusGrafana那样重量级的全家桶虽然它们很强大而是专注于利用树莓派自带的工具和简单的脚本实现核心指标的实时采集、历史记录和预警。无论你是用树莓派做下载机、媒体中心还是跑一些自动化脚本这套监控方案都能让你对它的“健康状况”了如指掌。整个过程不需要复杂的网络配置所有数据都在本地处理非常适合新手和追求简洁高效的玩家。2. 监控方案设计与工具选型2.1 为什么选择本地脚本化监控在决定方案前我评估过几种主流路径。一是使用像htop、glances这样的命令行实时监控工具它们能看瞬时状态但无法记录历史趋势人不能一直盯着屏幕。二是部署完整的监控栈比如用Prometheus采集、Grafana展示功能强大且美观但对于单台树莓派来说资源开销较大配置也相对复杂有点“杀鸡用牛刀”的感觉。因此我选择了第三条路基于Shell和Python脚本的本地化监控。它的核心优势在于轻量、可控、可定制。所有逻辑都掌握在自己手里数据存储在本地的文本文件或轻量级数据库中如SQLite几乎不占用额外CPU和内存资源。你可以自由决定监控频率、存储时长、报警阈值和通知方式比如发送邮件或推送到手机。这套方案的本质是把树莓派自身变成一个数据采集器和记录仪。2.2 核心监控指标与采集原理我们的监控聚焦于两个最关键的硬件指标CPU温度和内存使用率。CPU温度监控树莓派的SoC片上系统集成了温度传感器。在Linux系统中这个传感器的读数通常通过虚拟文件系统暴露出来。对于树莓派标准路径是/sys/class/thermal/thermal_zone0/temp。这个文件里存储的是一个整数代表温度值单位是毫摄氏度millidegree Celsius。所以读取这个文件的值除以1000就得到了我们熟悉的摄氏度。注意不同版本的树莓派或不同Linux发行版温度传感器的路径可能略有不同。但/sys/class/thermal/目录下通常会有thermal_zoneX的文件夹你可以用ls /sys/class/thermal/命令查看并尝试读取其中的temp文件。树莓派官方系统Raspbian/Raspberry Pi OS基本都使用上述路径。内存使用监控Linux系统的内存信息都汇总在/proc/meminfo这个虚拟文件中。这个文件包含了内存总量、已使用量、空闲量、缓存、缓冲区等数十个详细指标。对我们来说最常用的是计算已用内存百分比。通常的计算公式是已用内存 MemTotal - MemAvailable。MemAvailable是内核估算的、在不发生交换swap的情况下可用内存量比单纯的MemFree更准确因为它包含了可回收的缓存和缓冲区。因此内存使用率 (MemTotal - MemAvailable) / MemTotal * 100%。2.3 工具栈选型与理由数据采集Bash Shell脚本。对于简单的文件读取和数值计算Shell脚本是最直接、最高效的选择无需任何外部依赖天生适合Cron定时任务。数据存储CSV文本文件。初期我们选择用逗号分隔值文件来存储历史数据。它结构简单人类可读几乎任何工具都能打开和处理。当数据量变大后可以平滑迁移到SQLite数据库。数据可视化Python Matplotlib。虽然Shell脚本能采集和存储数据但生成图表还是Python更擅长。Matplotlib是Python最经典的绘图库功能强大可以轻松生成折线图直观展示温度和时间、内存使用率和时间的趋势关系。任务调度Cron。Linux系统自带的Cron守护进程是执行定时任务的黄金标准。我们可以设置每分钟或每5分钟执行一次数据采集脚本将数据追加到CSV文件中。可选报警通知Python smtplib库邮件或Pushover API手机推送。当指标超过阈值时脚本可以触发报警。邮件是最通用的方式而Pushover等服务可以提供更及时的手机通知。这套工具栈全部由树莓派系统自带或可通过apt/pip轻松安装保证了最大的兼容性和最低的资源消耗。3. 核心脚本编写与功能实现3.1 数据采集脚本Shell版本首先我们创建数据采集脚本。我把它命名为monitor_collector.sh并放在用户主目录下例如/home/pi/。#!/bin/bash # monitor_collector.sh # 功能采集树莓派CPU温度和内存使用率并追加记录到CSV文件 # 1. 定义数据存储文件路径 LOG_FILE/home/pi/system_monitor_log.csv # 2. 获取当前时间戳格式YYYY-MM-DD HH:MM:SS TIMESTAMP$(date %Y-%m-%d %H:%M:%S) # 3. 采集CPU温度单位摄氏度 # 读取温度文件内容为毫摄氏度除以1000转换 CPU_TEMP_RAW$(cat /sys/class/thermal/thermal_zone0/temp) CPU_TEMP$(echo scale1; $CPU_TEMP_RAW / 1000 | bc) # 如果bc命令未安装可以用awkCPU_TEMP$(awk -v raw$CPU_TEMP_RAW BEGIN {printf %.1f, raw/1000}) # 4. 采集内存使用率单位百分比 # 读取/proc/meminfo提取MemTotal和MemAvailable MEM_TOTAL$(grep -w MemTotal /proc/meminfo | awk {print $2}) # 单位是KB MEM_AVAILABLE$(grep -w MemAvailable /proc/meminfo | awk {print $2}) # 单位是KB # 计算已用内存KB和内存使用率% MEM_USED$((MEM_TOTAL - MEM_AVAILABLE)) MEM_USAGE_PERCENT$(echo scale2; $MEM_USED * 100 / $MEM_TOTAL | bc) # 5. 将数据写入CSV文件 # 如果文件不存在先写入表头 if [ ! -f $LOG_FILE ]; then echo Timestamp,CPU_Temp_C,Memory_Usage_Percent $LOG_FILE fi # 追加数据行 echo $TIMESTAMP,$CPU_TEMP,$MEM_USAGE_PERCENT $LOG_FILE # 6. 可选控制台输出用于调试 echo [$TIMESTAMP] CPU Temp: ${CPU_TEMP}C, Memory Usage: ${MEM_USAGE_PERCENT}%脚本关键点解析与注意事项bc命令的使用脚本中用了bc计算器来处理浮点数运算温度转换和百分比计算。如果你的系统没有安装bc可以用sudo apt install bc安装或者改用awk进行浮点计算注释中已给出替代方案。MemAvailablevsMemFree务必使用MemAvailable来计算内存使用率。MemFree是完全没有被使用的内存而Linux会利用空闲内存做磁盘缓存cached和缓冲区buffers这部分内存在应用需要时可以立刻释放。MemAvailable是内核估算的“实际可用内存”更能反映真实的内存压力。文件权限创建脚本后记得给它添加可执行权限chmod x /home/pi/monitor_collector.sh。路径问题确保LOG_FILE变量定义的路径你有写入权限。通常用户主目录/home/pi/是安全的。3.2 配置Cron定时任务脚本写好了我们需要让它定期自动运行。使用Cron来设置每分钟执行一次。打开当前用户的Cron配置编辑器crontab -e如果是第一次使用可能会让你选择编辑器选择nano最简单即可。在打开的Cron配置文件中在最后添加一行* * * * * /home/pi/monitor_collector.sh这五个星号分别代表分钟、小时、日、月、星期。*表示“每”。所以* * * * *就是每分钟执行一次。保存并退出在nano编辑器中按CtrlX然后按Y确认再按Enter保存。现在你的树莓派每分钟都会采集一次系统状态并记录到CSV文件中。你可以等待几分钟然后用cat /home/pi/system_monitor_log.csv查看是否已经有数据生成。3.3 数据可视化脚本Python版本有了历史数据我们还需要一个直观的方式来看趋势。下面是一个Python脚本monitor_visualizer.py它读取CSV文件并生成过去一段时间例如24小时的温度和内存使用率曲线图。#!/usr/bin/env python3 # monitor_visualizer.py # 功能读取监控日志CSV生成CPU温度和内存使用率趋势图 import pandas as pd import matplotlib.pyplot as plt from datetime import datetime, timedelta import matplotlib.dates as mdates # 1. 定义文件路径和参数 LOG_FILE /home/pi/system_monitor_log.csv OUTPUT_IMAGE /home/pi/system_monitor_plot.png HOURS_TO_PLOT 24 # 绘制最近多少小时的数据 # 2. 读取CSV数据 try: df pd.read_csv(LOG_FILE) except FileNotFoundError: print(f错误未找到日志文件 {LOG_FILE}请先运行数据采集脚本。) exit(1) # 3. 数据预处理 # 将时间戳字符串转换为datetime对象方便绘图 df[Timestamp] pd.to_datetime(df[Timestamp]) # 设置时间为索引 df.set_index(Timestamp, inplaceTrue) # 4. 筛选最近N小时的数据 cutoff_time datetime.now() - timedelta(hoursHOURS_TO_PLOT) df_recent df[df.index cutoff_time] if df_recent.empty: print(f警告最近{HOURS_TO_PLOT}小时内没有数据。) # 可以选择绘制全部数据 df_recent df # 5. 创建图表 fig, (ax1, ax2) plt.subplots(2, 1, figsize(12, 8), sharexTrue) # 子图1CPU温度 ax1.plot(df_recent.index, df_recent[CPU_Temp_C], colortomato, linewidth2, markero, markersize3) ax1.set_ylabel(CPU Temperature (°C), fontsize12) ax1.set_title(fRaspberry Pi System Monitor (Last {HOURS_TO_PLOT} Hours), fontsize14, fontweightbold) ax1.grid(True, linestyle--, alpha0.7) # 添加一条高温警戒线例如70度 ax1.axhline(y70, colorred, linestyle:, linewidth1.5, labelWarning (70°C)) ax1.legend() # 子图2内存使用率 ax2.plot(df_recent.index, df_recent[Memory_Usage_Percent], colorsteelblue, linewidth2, markers, markersize3) ax2.set_ylabel(Memory Usage (%), fontsize12) ax2.set_xlabel(Time, fontsize12) ax2.grid(True, linestyle--, alpha0.7) # 添加一条内存警戒线例如85% ax2.axhline(y85, colororange, linestyle:, linewidth1.5, labelWarning (85%)) ax2.legend() # 6. 美化X轴时间格式 # 根据时间跨度自动调整时间刻度显示密度 time_span (df_recent.index.max() - df_recent.index.min()).total_seconds() / 3600 # 小时数 if time_span 6: # 6小时内每小时一个刻度 ax2.xaxis.set_major_locator(mdates.HourLocator(interval1)) ax2.xaxis.set_major_formatter(mdates.DateFormatter(%H:%M)) elif time_span 24: # 24小时内每3小时一个刻度 ax2.xaxis.set_major_locator(mdates.HourLocator(interval3)) ax2.xaxis.set_major_formatter(mdates.DateFormatter(%m-%d %H:%M)) else: # 超过1天每天一个刻度 ax2.xaxis.set_major_locator(mdates.DayLocator()) ax2.xaxis.set_major_formatter(mdates.DateFormatter(%m-%d)) plt.gcf().autofmt_xdate() # 自动旋转日期标签防止重叠 # 7. 调整布局并保存图片 plt.tight_layout() plt.savefig(OUTPUT_IMAGE, dpi150) print(f图表已生成并保存至{OUTPUT_IMAGE}) # 可选如果想直接在树莓派上显示图表如果有桌面环境可以取消下面这行的注释 # plt.show()脚本关键点解析与注意事项依赖库安装这个脚本需要pandas和matplotlib库。如果系统没有请使用pip安装pip3 install pandas matplotlib。如果安装速度慢可以考虑使用国内镜像源例如pip3 install pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple。Pandas的强大我们使用pandas库来读取和处理CSV数据它处理时间序列数据非常方便。pd.to_datetime能自动解析我们格式化的时间字符串。图表自定义脚本中设置了高温70°C和高内存使用率85%的警戒线。你可以根据自己树莓派的体质比如有无散热风扇、外壳类型和应用负载来调整这些阈值。运行方式你可以手动运行这个脚本生成图表python3 /home/pi/monitor_visualizer.py。生成的PNG图片可以通过SFTP下载到电脑查看或者如果树莓派安装了桌面环境可以直接打开。3.4 进阶功能添加阈值报警监控的最终目的是预警。我们可以修改数据采集脚本在采集数据的同时检查阈值一旦超标就触发报警。这里以发送电子邮件为例。首先你需要一个可用的发件邮箱比如QQ邮箱、163邮箱并开启SMTP服务通常需要申请授权码而非登录密码。然后创建一个报警脚本monitor_alert.py#!/usr/bin/env python3 # monitor_alert.py # 功能检查最新监控数据超过阈值则发送邮件报警 import smtplib from email.mime.text import MIMEText from email.header import Header import subprocess import sys # 1. 邮件服务器配置以QQ邮箱为例 SMTP_SERVER smtp.qq.com SMTP_PORT 465 # SSL端口 SENDER_EMAIL your_emailqq.com # 你的发件邮箱 SENDER_AUTH_CODE your_authorization_code # 邮箱的授权码不是登录密码 RECEIVER_EMAIL receiver_emailexample.com # 收件邮箱 # 2. 报警阈值 CPU_TEMP_THRESHOLD 70.0 # 摄氏度 MEM_USAGE_THRESHOLD 85.0 # 百分比 # 3. 获取最新的监控数据 # 调用Shell脚本中的命令来获取实时数据避免重复逻辑 def get_system_stats(): try: # 获取CPU温度 temp_raw subprocess.check_output([cat, /sys/class/thermal/thermal_zone0/temp]).decode().strip() cpu_temp float(temp_raw) / 1000.0 # 获取内存信息 meminfo subprocess.check_output([grep, -E, ^(MemTotal|MemAvailable), /proc/meminfo]).decode() mem_lines meminfo.splitlines() mem_dict {} for line in mem_lines: key, value line.split(:) mem_dict[key.strip()] int(value.strip().split()[0]) # 提取数值单位KB mem_usage (mem_dict[MemTotal] - mem_dict[MemAvailable]) * 100.0 / mem_dict[MemTotal] return cpu_temp, mem_usage except Exception as e: print(f获取系统状态失败: {e}) return None, None # 4. 检查并发送报警 def check_and_alert(): cpu_temp, mem_usage get_system_stats() if cpu_temp is None or mem_usage is None: return alert_messages [] alert_subject_parts [] if cpu_temp CPU_TEMP_THRESHOLD: msg fCPU温度过高{cpu_temp:.1f}°C (阈值: {CPU_TEMP_THRESHOLD}°C) alert_messages.append(msg) alert_subject_parts.append(fCPU:{cpu_temp:.0f}C) if mem_usage MEM_USAGE_THRESHOLD: msg f内存使用率过高{mem_usage:.1f}% (阈值: {MEM_USAGE_THRESHOLD}%) alert_messages.append(msg) alert_subject_parts.append(fMem:{mem_usage:.0f}%) if alert_messages: # 构建邮件内容 subject f【树莓派报警】{ .join(alert_subject_parts)} body \n.join(alert_messages) body f\n\n时间{subprocess.check_output([date]).decode().strip()} body \n请及时检查树莓派运行状态。 send_email(subject, body) # 5. 发送邮件函数 def send_email(subject, body): message MIMEText(body, plain, utf-8) message[From] Header(fRaspberry Pi Monitor {SENDER_EMAIL}, utf-8) message[To] Header(RECEIVER_EMAIL, utf-8) message[Subject] Header(subject, utf-8) try: smtp_obj smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) smtp_obj.login(SENDER_EMAIL, SENDER_AUTH_CODE) smtp_obj.sendmail(SENDER_EMAIL, [RECEIVER_EMAIL], message.as_string()) smtp_obj.quit() print(f报警邮件已发送{subject}) except smtplib.SMTPException as e: print(f邮件发送失败: {e}) if __name__ __main__: check_and_alert()最后修改我们的monitor_collector.sh脚本在采集数据后调用这个Python报警脚本假设报警脚本也放在/home/pi/下#!/bin/bash # ... (前面的采集和记录代码不变) ... # 7. 调用Python脚本检查阈值并报警 python3 /home/pi/monitor_alert.py重要安全提示务必妥善保管你的邮箱授权码SENDER_AUTH_CODE不要直接写在脚本里然后上传到公开的代码仓库。一个更好的做法是将敏感信息邮箱、授权码、阈值写入一个单独的配置文件如config.ini然后在脚本中读取并确保该配置文件有严格的权限如chmod 600 config.ini。4. 系统部署、优化与问题排查4.1 完整部署流程与初始化为了让整个监控系统开箱即用我们可以创建一个一键安装和初始化的脚本。下面是一个setup_monitor.sh的示例#!/bin/bash # setup_monitor.sh - 树莓派系统监控一键部署脚本 echo 开始部署树莓派系统监控... # 1. 安装必要的软件包 echo 步骤1: 安装系统依赖... sudo apt update sudo apt install -y bc python3-pip # bc用于Shell计算pip3用于安装Python包 # 2. 安装Python依赖库 echo 步骤2: 安装Python依赖 (pandas, matplotlib)... pip3 install pandas matplotlib # 3. 创建脚本文件假设脚本内容已准备好这里以从当前目录复制为例 echo 步骤3: 复制监控脚本到用户目录... SCRIPT_DIR$( cd $( dirname ${BASH_SOURCE[0]} ) /dev/null pwd ) cp $SCRIPT_DIR/monitor_collector.sh /home/pi/ cp $SCRIPT_DIR/monitor_visualizer.py /home/pi/ cp $SCRIPT_DIR/monitor_alert.py /home/pi/ # 4. 设置脚本权限 chmod x /home/pi/monitor_collector.sh chmod x /home/pi/monitor_visualizer.py chmod x /home/pi/monitor_alert.py # 5. 配置Cron定时任务 echo 步骤4: 配置Cron定时任务每分钟采集一次... # 先检查是否已存在该任务 (crontab -l 2/dev/null | grep -q monitor_collector.sh) echo Cron任务已存在跳过。 || { (crontab -l 2/dev/null; echo * * * * * /home/pi/monitor_collector.sh) | crontab - echo Cron任务添加成功。 } # 6. 可选首次运行测试 echo 步骤5: 进行首次运行测试... /home/pi/monitor_collector.sh echo 等待5秒查看日志... sleep 5 if [ -f /home/pi/system_monitor_log.csv ]; then echo 日志文件生成成功前3行内容 head -n 3 /home/pi/system_monitor_log.csv else echo 警告日志文件未生成请检查脚本。 fi echo 部署完成 echo - 数据日志: /home/pi/system_monitor_log.csv echo - 采集脚本: /home/pi/monitor_collector.sh (每分钟自动运行) echo - 可视化脚本: /home/pi/monitor_visualizer.py (手动运行生成图表) echo - 报警脚本: 已集成到采集脚本中你需要将四个脚本文件monitor_collector.sh,monitor_visualizer.py,monitor_alert.py,setup_monitor.sh放在同一个目录然后在树莓派上运行./setup_monitor.sh即可完成部署。4.2 数据管理与长期运行优化系统运行一段时间后CSV日志文件会越来越大。我们需要考虑日志轮转Log Rotation和长期存储优化。方案一使用Logrotate系统自带这是最规范的方法。创建一个Logrotate配置文件/etc/logrotate.d/raspberrypi_monitor/home/pi/system_monitor_log.csv { daily # 每天轮转一次 rotate 30 # 保留30个备份即30天的历史数据 compress # 压缩旧的日志文件以节省空间 delaycompress # 延迟压缩下一次轮转时才压缩上一次的备份 missingok # 如果日志文件丢失不报错 notifempty # 如果日志文件为空不轮转 create 644 pi pi # 轮转后创建新文件并设置权限和所有者 }配置完成后Logrotate会每天自动帮你管理日志文件生成类似system_monitor_log.csv.1.gz,system_monitor_log.csv.2.gz的压缩备份。方案二修改采集脚本实现简单的滚动覆盖如果你不想配置Logrotate可以在Shell采集脚本开头加入日志清理逻辑例如只保留最近7天的数据#!/bin/bash LOG_FILE/home/pi/system_monitor_log.csv MAX_LINES$((7 * 24 * 60)) # 7天 * 24小时 * 60分钟/天 10080行 # 如果文件行数超过MAX_LINES则保留最后MAX_LINES行 if [ -f $LOG_FILE ]; then CURRENT_LINES$(wc -l $LOG_FILE) if [ $CURRENT_LINES -gt $MAX_LINES ]; then tail -n $MAX_LINES $LOG_FILE $LOG_FILE.tmp mv $LOG_FILE.tmp $LOG_FILE echo 日志已滚动保留最近 $MAX_LINES 条记录。 fi fi # ... 后续采集数据代码不变 ...方案三迁移到SQLite数据库推荐用于长期项目当数据量很大或需要复杂查询时CSV文件会变得笨重。迁移到SQLite数据库是一个平滑的升级方案。你可以创建一个新的Python采集脚本使用SQLite来存储数据查询和生成图表会更高效。这里提供一个简单的改造思路初始化数据库CREATE TABLE monitor_data (timestamp DATETIME, cpu_temp REAL, mem_usage REAL);修改采集脚本将数据INSERT到数据库中。修改可视化脚本使用SELECT语句查询数据并用pandas的read_sql_query函数读取。4.3 常见问题与排查技巧实录在实际部署和运行中你可能会遇到以下问题。这里是我踩过的一些坑和解决方法问题1Cron任务没有执行日志文件没有更新。排查步骤检查Cron服务状态sudo systemctl status cron(或crond)。确保它是active (running)。检查Cron日志树莓派的Cron日志通常在/var/log/syslog或/var/log/cron.log。用sudo grep CRON /var/log/syslog查看最近Cron的执行记录看是否有错误信息。检查脚本路径和权限Cron执行的环境与用户登录环境不同可能$PATH变量不全。在Cron任务中务必使用绝对路径。同时确保脚本有可执行权限chmod x。检查脚本输出可以在Cron任务中重定向输出到文件便于调试* * * * * /home/pi/monitor_collector.sh /home/pi/cron.log 21。然后查看/home/pi/cron.log文件中的错误信息。我的经验90%的Cron问题都是路径问题。在脚本内部对于调用的命令如cat,grep,bc,python3也最好使用绝对路径如/usr/bin/python3或者直接在脚本开头设置PATH环境变量PATH/usr/bin:/bin。问题2Python脚本运行报错提示找不到模块如pandas,matplotlib。原因Cron环境下的PATH和PYTHONPATH可能与终端环境不同导致找不到pip安装的第三方库。解决在Python脚本中指定完整解释器路径#!/usr/bin/env python3这行通常没问题但如果不行可以改为绝对路径如#!/usr/bin/python3。在Cron任务中在命令前加载用户的环境变量。例如如果你用pip3 --user安装的包可以这样写* * * * * . /home/pi/.profile; /home/pi/monitor_collector.sh最稳妥的办法是使用虚拟环境virtualenv并在Cron任务中激活该环境来运行脚本。问题3CPU温度读数异常如始终为0或极高/极低。排查确认温度传感器路径ls /sys/class/thermal/。树莓派通常是thermal_zone0。尝试cat /sys/class/thermal/thermal_zone0/type输出应该是cpu-thermal或类似。手动读取温度文件cat /sys/class/thermal/thermal_zone0/temp看看输出是否是一个合理的数字如45000代表45.0°C。如果输出是cat: /sys/class/thermal/thermal_zone0/temp: No such file or directory说明路径不对。尝试其他可能路径有些发行版或硬件版本可能在/sys/class/hwmon/目录下。可以尝试find /sys -name temp1_input 2/dev/null来查找温度传感器文件。我的经验在非官方系统如Ubuntu Server for Raspberry Pi上温度传感器路径可能不同。需要根据实际系统进行适配。问题4内存使用率计算超过100%或为负值。原因/proc/meminfo中的MemAvailable字段在某些非常老的内核版本中可能不存在。或者计算逻辑有误。解决检查你的内核是否支持MemAvailablegrep MemAvailable /proc/meminfo。如果没有输出你需要使用旧的计算方式MemUsed MemTotal - MemFree - Buffers - Cached。但请注意这种方式计算出的“已用内存”会偏大因为缓冲区和缓存并非完全不能被应用使用。在脚本中加入版本判断逻辑if grep -q MemAvailable /proc/meminfo; then # 使用MemAvailable计算 MEM_USED$((MEM_TOTAL - MEM_AVAILABLE)) else # 回退到旧的计算方式 MEM_FREE$(grep -w MemFree /proc/meminfo | awk {print $2}) BUFFERS$(grep -w Buffers /proc/meminfo | awk {print $2}) CACHED$(grep -w ^Cached /proc/meminfo | awk {print $2}) MEM_USED$((MEM_TOTAL - MEM_FREE - BUFFERS - CACHED)) fi问题5图表生成失败或图片空白。排查检查pandas和matplotlib是否成功安装pip3 list | grep -E pandas|matplotlib。检查CSV日志文件格式是否正确时间戳列是否能被pd.to_datetime正确解析。可以手动用head命令查看文件内容。如果是在无图形界面的服务器上运行树莓派Lite版本matplotlib默认需要图形后端如Tkinter来显示这在服务器上不存在。我们需要告诉matplotlib使用不需要显示器的“Agg”后端来生成图片。在Python脚本开头添加import matplotlib matplotlib.use(Agg) # 必须在导入pyplot之前设置 import matplotlib.pyplot as plt这样plt.savefig()就能正常工作而plt.show()会失效在服务器上本来也用不到。这套从采集、存储、可视化到报警的本地监控方案我已经在树莓派4B上稳定运行了半年多它成功帮我预警了几次因软件bug导致的内存缓慢泄漏以及一次因为风扇积灰导致的散热效率下降。它的价值不在于技术有多炫酷而在于用最小的资源消耗提供了对系统状态持续、可靠的洞察力让你能安心地把树莓派放在角落里执行那些重要的长期任务。本文还有配套的精品资源点击获取
返回列表