想直接拿到 /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。
常见操作步骤:
- 先确认哪个
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 才是真实温度 - 如果报
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)。
启用 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 对应 sensor,它不会自动启用 —— 在 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的事件机制,或直接监听inotifyontemp*_input(但大多数 hwmon 设备不支持 inotify)
真正影响读数准确性的,往往不是脚本写法,而是传感器芯片本身的采样周期和内核驱动实现 —— 这一点容易被忽略。