对于树莓派和香橙派这类小型嵌入式设备来说,CPU温度监控是个容易被忽视但极其重要的工作。我在实际使用中就遇到过因为散热不良导致系统自动降频的情况——当时正在运行的AI图像识别程序突然变得卡顿,排查了半天才发现是温度过高触发了保护机制。
这类单板电脑的散热条件通常比较有限,长时间高负载运行时温度很容易飙升。持续高温不仅会影响性能,还可能缩短硬件寿命。特别是在以下场景中,温度监控显得尤为重要:
好消息是,Linux系统为我们提供了多种便捷的温度监控方案,从简单的命令行查询到自动化脚本应有尽有。下面我就分享几种经过实战检验的监控方法。
树莓派用户最方便的是使用官方提供的vcgencmd工具。直接在终端输入:
bash复制vcgencmd measure_temp
你会看到类似temp=48.5'C的输出。这个命令直接返回摄氏温度,不需要任何计算。如果提示命令不存在,可能需要先安装相关软件包:
bash复制sudo apt install libraspberrypi-bin
无论是树莓派还是香橙派,都可以通过读取系统文件来获取温度信息:
bash复制cat /sys/class/thermal/thermal_zone0/temp
这个命令会返回一个整数,单位是毫摄氏度。要转换成熟悉的摄氏度,可以配合awk命令:
bash复制awk '{printf "CPU温度:%.2f°C\n", $1/1000}' /sys/class/thermal/thermal_zone0/temp
我在香橙派5上实测时发现,某些型号可能有多个thermal_zone,这时可以尝试查看thermal_zone1或thermal_zone2。要列出所有温度传感器,可以运行:
bash复制ls /sys/class/thermal/thermal_zone*
手动执行命令毕竟不够方便,Linux的watch命令可以定时自动刷新显示:
bash复制watch -n 3 'echo CPU温度:$(vcgencmd measure_temp | cut -c6-11)'
这个命令会每3秒更新一次温度显示(-n参数指定间隔秒数)。cut命令用于提取温度数值部分,去掉前面的"temp="和后缀"'C"。
对于通用方案,可以使用:
bash复制watch -n 3 "awk '{printf \"当前温度:%.2f°C\\n\", \$1/1000}' /sys/class/thermal/thermal_zone0/temp"
在基于Debian的系统上(包括树莓派OS和香橙派系统),还可以安装功能更强大的lm-sensors:
bash复制sudo apt install lm-sensors
sudo sensors-detect
安装过程中对所有提示都选择yes。完成后运行:
bash复制sensors
这个工具不仅能显示CPU温度,还能获取风扇转速、电压等其他硬件信息。对于需要全面监控的场景特别有用。
把上面的命令封装成脚本会更方便日常使用。创建一个名为monitor_temp.sh的文件:
bash复制#!/bin/bash
# 设置刷新间隔(秒)
INTERVAL=3
while true
do
clear
echo "===== CPU温度监控 ====="
date
echo "-----------------------"
# 尝试多种获取温度的方式
if command -v vcgencmd &> /dev/null; then
# 树莓派专用命令
TEMP=$(vcgencmd measure_temp | cut -c6-11)
echo "当前温度:${TEMP}°C (vcgencmd)"
else
# 通用方案
TEMP=$(awk '{printf "%.2f", $1/1000}' /sys/class/thermal/thermal_zone0/temp)
echo "当前温度:${TEMP}°C (sysfs)"
fi
echo "-----------------------"
echo "按Ctrl+C退出监控"
sleep $INTERVAL
done
给脚本添加执行权限后运行:
bash复制chmod +x monitor_temp.sh
./monitor_temp.sh
这个脚本的优点在于自动适配不同设备,优先使用树莓派的专用命令,不存在时回退到通用方案。
我们可以扩展脚本,当温度超过阈值时发出警告:
bash复制#!/bin/bash
INTERVAL=3
WARNING_THRESHOLD=70 # 警告阈值(摄氏度)
CRITICAL_THRESHOLD=80 # 严重阈值(摄氏度)
while true
do
clear
# 获取温度
if command -v vcgencmd &> /dev/null; then
TEMP=$(vcgencmd measure_temp | cut -c6-9)
else
TEMP=$(awk '{printf "%.0f", $1/1000}' /sys/class/thermal/thermal_zone0/temp)
fi
# 显示信息
echo "===== CPU温度监控 ====="
date
echo "当前温度:${TEMP}°C"
# 告警判断
if [ $TEMP -ge $CRITICAL_THRESHOLD ]; then
echo -e "\033[41m警告:温度过高!请立即处理!\033[0m"
elif [ $TEMP -ge $WARNING_THRESHOLD ]; then
echo -e "\033[43m注意:温度较高,建议检查散热\033[0m"
fi
echo "-----------------------"
echo "按Ctrl+C退出监控"
sleep $INTERVAL
done
这个版本会在温度达到70°C时显示黄色警告,超过80°C时显示红色警报,非常直观。
长期监控温度变化有助于分析设备运行状况。修改脚本添加日志功能:
bash复制#!/bin/bash
INTERVAL=60 # 改为60秒记录一次
LOG_FILE="/var/log/cpu_temp.log"
# 确保日志目录存在
mkdir -p $(dirname $LOG_FILE)
touch $LOG_FILE
while true
do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
if command -v vcgencmd &> /dev/null; then
TEMP=$(vcgencmd measure_temp | cut -c6-9)
else
TEMP=$(awk '{printf "%.0f", $1/1000}' /sys/class/thermal/thermal_zone0/temp)
fi
# 写入日志
echo "$TIMESTAMP,$TEMP" >> $LOG_FILE
sleep $INTERVAL
done
这个脚本每分钟记录一次温度到日志文件。要查看最近10条记录可以运行:
bash复制tail -n 10 /var/log/cpu_temp.log
如果你更喜欢图形化界面,可以用Python的matplotlib库绘制温度曲线。安装必要的库:
bash复制sudo apt install python3-pip
pip3 install matplotlib
然后创建plot_temp.py脚本:
python复制import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
# 读取日志文件
timestamps = []
temps = []
with open('/var/log/cpu_temp.log', 'r') as f:
for line in f:
parts = line.strip().split(',')
if len(parts) == 2:
timestamps.append(datetime.strptime(parts[0], '%Y-%m-%d %H:%M:%S'))
temps.append(float(parts[1]))
# 创建图表
plt.figure(figsize=(12, 6))
plt.plot(timestamps, temps, label='CPU温度', marker='o')
plt.axhline(y=70, color='r', linestyle='--', label='警告阈值')
plt.title('CPU温度变化趋势')
plt.xlabel('时间')
plt.ylabel('温度(°C)')
plt.legend()
plt.grid(True)
# 格式化x轴
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M'))
plt.gcf().autofmt_xdate()
plt.tight_layout()
plt.savefig('/tmp/cpu_temp_plot.png')
print("图表已保存为 /tmp/cpu_temp_plot.png")
运行脚本后会生成一张温度变化曲线图,可以清楚地看到一天中的温度波动情况。