如果你想直接获取 /sys/class/hwmon 里的原始温度读数,其实操作并不难:先执行 cat /sys/class/hwmon/hwmon/name,找到名称中包含 coretemp 或 k10temp 的目录;然后再读取对应的 temp_input 文件。这里得到的数值单位是“毫摄氏度”,最终需要除以 1000,才能换算成实际温度。

怎么直接从 /sys/class/hwmon 读取原始温度值
通常不需要额外安装任何工具,只要系统已经正确加载硬件传感器驱动,例如 coretemp 或 k10temp,就可以直接读取温度数据。关键路径就是 /sys/class/hwmon/hwmon*/temp*_input:这些文件中保存的是“毫摄氏度”的整数值,比如 42500,换算后就是 42.5°C。这也是 Linux/Ubuntu 查看 CPU 温度、硬件传感器温度时最常见的底层方式。
常见操作步骤:
- 先确认哪个
hwmon*对应 CPU:运行cat /sys/class/hwmon/hwmon*/name,输出中包含coretemp或k10temp的目录通常就是目标设备 - 进入对应目录,例如
/sys/class/hwmon/hwmon0,然后执行ls temp*_input查看可读取的温度通道,如temp1_input、temp2_input等 - 使用
cat temp1_input读取原始数值,注意结果必须除以 1000,才能得到真实的 CPU 温度 - 如果提示
Permission denied,说明当前用户没有读取 sysfs 的权限 —— 不建议直接写成sudo cat,更合理的方法是将用户加入video或root组,或者调整/sys/class/hwmon/hwmon*/device下相关的 udev 规则
sensors 命令输出不稳定?常见干扰和过滤技巧
sensors 命令本质上只是一个封装工具,底层依旧是读取 /sys/class/hwmon,但它会尝试解析系统中的所有传感器芯片,因此很容易因为某个传感器 I/O 错误导致整行输出中断,例如出现 ERROR: Can't get value of subfeature temp*_min: I/O error 这类报错。
想更稳定地提取温度数据,可以参考以下方法:
- 使用
sensors 2>&1 | grep -E 'Core [0-9]|Package id|temp[0-9]+_input'过滤出有效温度行,减少无关输出干扰 - 不要过度依赖空格分隔,因为字段位置并不固定,推荐用
awk提取冒号后的数值,例如sensors 2>&1 | awk -F': ' '/Core 0/ {print $2}' | sed 's/°C.*//' - 某些主板上的
acpitz输出单位是千分之一摄氏度,但不会明确带上单位标识,因此脚本处理时要统一换算逻辑,不能只依赖字符串匹配
Psensor 图形界面里为什么找不到 GPU 温度
Psensor 默认只显示 lm-sensors 能识别到的硬件设备,而 NVIDIA GPU 温度通常依赖 XNVCtrl 库支持,AMD GPU 则依赖 amdgpu 驱动暴露的 sysfs 接口,例如 /sys/class/hwmon/hwmon*/device/temp1_input。因此在 Ubuntu 或其他 Linux 系统中,Psensor 看不到显卡温度往往并不是软件故障,而是驱动或依赖条件没有满足。
启用 GPU 温度监控的必要条件:
- NVIDIA 用户需要安装
nvidia-settings和libxnvctrl-dev(Ubuntu 软件源中通常叫libxnvctrl1),否则 Psensor 无法识别并显示 GPU 温度条目 - 确认 X server 正在运行,并且当前用户拥有访问
/dev/nvidiactl的权限(常见报错表现为 “No NVIDIA GPU found”) - AMD 用户需要检查
amdgpu模块是否已经加载(lsmod | grep amdgpu),同时确认/sys/class/hwmon/hwmon*/name中存在amdgpu字样 - Psensor 启动后还需要手动勾选对应的 GPU 传感器,它不会自动启用 —— 可在 Preferences → Sensors 中展开 “NVIDIA GPU” 或 “AMD GPU”,然后手动勾选需要显示的项目
监控脚本里用 watch -n 1 为什么温度刷新不准
watch 本质上只是简单轮询,而硬件传感器本身的更新频率通常受内核驱动限制。有些芯片,例如 it87,默认每 2 秒才会刷新一次 temp*_input,所以即便执行 watch -n 1,也只是每秒强制重新读取文件,并不等于真正的实时采样。
更稳妥、更准确的做法:
- 先确认传感器的最大更新频率:读取
/sys/class/hwmon/hwmon*/update_interval(单位为毫秒),多数 Intel CPU 常见值是 2000,也就是每 2 秒更新一次 - 避免过于频繁地轮询:高频读取
temp*_input有时可能触发内核限频保护,反而让温度响应出现延迟 - 如果确实需要亚秒级精度,例如用于风扇控制或更精细的系统监控,就需要改用
libsensor的事件机制,或者直接监听temp*_input的inotify事件(不过大多数 hwmon 设备并不支持inotify)
真正影响温度读数准确性的,很多时候并不是监控脚本本身,而是传感器芯片的采样周期以及内核驱动的实现方式 —— 这一点在 Linux 硬件监控场景中非常容易被忽视。
