sensors命令无输出是因为未运行sensors-detect或未加载对应内核模块;需执行sudo sensors-detect并输入yes探测,再手动modprobe coretemp/k10temp等模块,或改用/sys/class/thermal路径读取毫摄氏度值。

sensors 命令是查看 CPU 温度最可靠的方式,但必须先完成 sensors-detect 并加载对应内核模块,否则输出为空或显示 Adapter: Non-I2C bus
为什么 sensors 命令没输出温度?
常见错误现象:sensors 执行后无任何温度行,或只显示 Adapter: Non-I2C bus;sensors-detect 过程中跳过关键步骤导致模块未加载。
- 运行
sudo sensors-detect时,在Probe I2C adapter?提示处必须输入YES(不能直接回车),否则不会探测主板传感器芯片 - 探测完成后需手动加载模块:执行
sudo modprobe coretemp k10temp nct6779(根据探测结果选对应模块,Intel 多为coretemp,AMD 多为k10temp) - 检查是否已加载:
lsmod | grep -E "(coretemp|k10temp)",无输出说明模块未就位 - 部分笔记本或迷你 PC 主板未启用 EC 或 thermal 驱动,
sensors无法读取,此时应转向/sys/class/thermal路径
如何用 /sys/class/thermal 快速定位 CPU 封装温度?
该路径不依赖额外工具,数值单位统一为毫摄氏度(m°C),适合脚本调用,但需人工筛选 zone 类型。
- 列出所有 thermal 区域:
ls /sys/class/thermal/,常见有效目录名如thermal_zone0、thermal_zone1 - 逐个检查类型:
cat /sys/class/thermal/thermal_zone*/type 2>/dev/null,重点关注含cpu-thermal、x86_pkg_temp、Package id 0的 zone - 读取对应温度值:
cat /sys/class/thermal/thermal_zoneX/temp(例如 72500 表示 72.5°C) - 避免硬编码 zone 编号:可用命令一键筛选并格式化输出:
for z in /sys/class/thermal/thermal_zone*; do [ "$(cat $z/type 2>/dev/null)" = "x86_pkg_temp" ] && echo "Package → $(($(cat $z/temp 2>/dev/null)/1000))°C"; done
实时监控频率和温度的轻量组合方案
单独用 sensors 看温度、cpupower frequency-info --freq 看当前频率,二者无法同步刷新;turbostat 可同时输出,但仅限 Intel CPU 且需 root 权限。
-
watch -n 1 'sensors | grep "Package|Core" && cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq 2>/dev/null | awk "{printf "Freq: %.0f MHz\n", $1/1000}"'—— 每秒刷新封装温度 + cpu0 当前频率 - Intel 平台推荐
sudo turbostat --interval 1:输出中PkgTmp是封装温度,GHz列是各核实时频率,PkgWatt是整颗 CPU 功耗,数据来自 MSR 寄存器,比 sensors 更接近硬件真实值 - 注意
turbostat报No permission to change system clock不影响温度/频率采集,忽略即可;若报Failed to open /dev/cpu/0/msr,需执行sudo modprobe msr - AMD 用户无法使用 turbostat,可改用
s-tui(sudo apt install s-tui && sudo s-tui),它在终端内整合温度、频率、功耗与负载,底层仍调用 sensors 和 sysfs
真正容易被忽略的是温度单位一致性:所有 sysfs 接口(/sys/class/thermal/、/sys/class/hwmon/)返回值都是毫摄氏度,而 sensors 输出直接带 °C;混用时若忘记除以 1000,会导致误判超温。另外,scaling_cur_freq 单位是 kHz,不是 MHz——这是脚本里最常翻车的地方。











