从零到实战的完整指南
目录导读
- 为什么需要监控服务器温度?
- 温度监控的核心原理与数据来源
- 基础脚本:Linux下的温度采集(使用
lm-sensors) - 进阶脚本:自动告警与日志记录
- 多平台适配:Windows与树莓派温度监控
- 可视化与集成:将温度数据推送到监控系统
- 常见问题与故障排除(附问答)
- 安全建议与最佳实践
为什么需要监控服务器温度?
服务器温度一旦过高,轻则导致性能降频(CPU/GPU throttling),重则引发硬件损坏、数据丢失甚至火灾,根据数据中心经验,温度每升高10°C,硬件故障率约增加一倍。编写一个温度监控脚本是运维工程师的必修课,它能帮助你在温度异常时第一时间获得通知,避免灾难性后果。

核心监控目标:
- CPU核心温度(Core Temp)
- GPU温度(如有独立显卡)
- 硬盘/SSD温度(SMART数据)
- 主板传感器温度(如南桥、北桥)
温度监控的核心原理与数据来源
温度数据并非凭空而来,它依赖于硬件传感器和操作系统接口,常见的温度数据源包括:
| 数据源 | Linux | Windows | 说明 |
|---|---|---|---|
| CPU | /sys/class/thermal/thermal_zone*/temp 或 lm-sensors |
WMI或第三方工具(如OpenHardwareMonitor) | 读取核心温度 |
| GPU | nvidia-smi(NVIDIA)或 radeontop(AMD) |
GPU-Z API或PowerShell | 显卡温度 |
| 硬盘 | smartctl(smartmontools) |
WMI 或 CrystalDiskInfo |
磁盘温度 |
| 主板 | sensors 命令 |
AIDA64或主板专有工具 | 机箱环境温度 |
注意:部分云服务器(如AWS EC2、阿里云ECS)不允许访问底层硬件传感器,此时只能依赖云厂商提供的Cloud Watch或RAM数据,本指南针对物理服务器或自建机房。
基础脚本:Linux下的温度采集(使用lm-sensors)
最经典的温度监控脚本依赖于 lm-sensors 套件,首先安装它:
# Debian/Ubuntu sudo apt install lm-sensors -y # CentOS/RHEL sudo yum install lm_sensors -y # 初始化传感器(一路yes即可) sudo sensors-detect
安装后运行 sensors 可看到类似输出:
coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +45.0°C (high = +80.0°C, crit = +100.0°C)
Core 0: +42.0°C (high = +80.0°C, crit = +100.0°C)
Core 1: +44.0°C (high = +80.0°C, crit = +100.0°C)
基础版本:仅输出温度
#!/bin/bash
# filename: temp_monitor.sh
# 简单输出CPU温度(摄氏度)
sensors | grep "Core" | awk '{print $3}' | sed 's/+//g; s/°C//g'
改进版:提取最高温度并判断是否安全
#!/bin/bash
# 获取所有核心温度的数值,找出最高值
MAX_TEMP=$(sensors | grep -oP '\+[0-9]+' | sed 's/+//' | sort -rn | head -1)
echo "Current Max CPU Temp: ${MAX_TEMP}°C"
# 阈值警告(通常80°C为警告线,90°C为危险线)
if [ "$MAX_TEMP" -gt 85 ]; then
echo "[WARN] Temperature exceeds 85°C! Please check cooling."
fi
测试运行:
chmod +x temp_monitor.sh ./temp_monitor.sh
进阶脚本:自动告警与日志记录
单纯输出温度不够,我们需要持续监控+告警+日志,以下脚本每30秒采集一次,当温度超过阈值时发送邮件告警,并记录到日志文件。
脚本:temp_monitor_advanced.sh
#!/bin/bash
# 配置参数
THRESHOLD=80 # 告警阈值(°C)
LOG_FILE="/var/log/temp_monitor.log"
EMAIL="admin@example.com" # 改成你的邮箱
INTERVAL=30 # 采集间隔(秒)
# 创建日志文件
touch "$LOG_FILE"
# 无限循环监控
while true; do
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
# 获取最高温度(兼容多种输出格式)
MAX_TEMP=$(sensors | grep -oP '[\+\-][0-9]+\.[0-9]' | sed 's/+//' | sort -rn | head -1)
# 如果获取失败(例如传感器不存在),跳过本次循环
if [ -z "$MAX_TEMP" ]; then
echo "$TIMESTAMP [ERROR] Unable to read temperature." >> "$LOG_FILE"
sleep $INTERVAL
continue
fi
# 写入日志
echo "$TIMESTAMP Temperature: ${MAX_TEMP}°C" >> "$LOG_FILE"
# 超阈值告警
if (( $(echo "$MAX_TEMP > $THRESHOLD" | bc -l) )); then
echo "$TIMESTAMP [ALERT] Temp ${MAX_TEMP}°C exceeds threshold ${THRESHOLD}°C." >> "$LOG_FILE"
# 发送邮件告警(需要安装 mailutils 或 sendmail)
echo "Server temperature is ${MAX_TEMP}°C at $TIMESTAMP" | mail -s "ALERT: Server Temp" "$EMAIL"
fi
sleep $INTERVAL
done
运行方式:在后台运行 nohup ./temp_monitor_advanced.sh &,或设置成 systemd 服务。
告警方式扩展(可选)
- 微信/钉钉机器人:通过webhook发送JSON请求。
- Slack:使用Incoming Webhook。
- 短信:调用云服务API(如Twilio)。
多平台适配:Windows与树莓派温度监控
Windows温度监控脚本(PowerShell)
Windows没有直接的 sensors 命令,但可以通过WMI或第三方工具获取,最稳定的是使用 OpenHardwareMonitor 的共享内存机制,或直接解析 wmic 的CPU温度(部分CPU支持)。
# filename: temp_monitor.ps1
# 使用 WMI 获取 CPU 温度(需管理员权限)
$temp = Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi"
if ($temp) {
$celsius = ($temp.CurrentTemperature / 10) - 273.15
Write-Host "CPU Temperature: $([math]::Round($celsius, 1))°C"
} else {
Write-Host "WMI temperature not available. Try installing OpenHardwareMonitor."
}
注意:虚拟机或某些笔记本可能不支持WMI温度读取,推荐使用 OpenHardwareMonitor + 其COM接口,或 LibreHardwareMonitor 的开源替代。
树莓派温度监控
树莓派读取温度极其简单:
#!/bin/bash
# 读取树莓派CPU温度
TEMP=$(cat /sys/class/thermal/thermal_zone0/temp)
TEMP_C=$(echo "scale=1; $TEMP / 1000" | bc)
echo "RPi CPU Temp: ${TEMP_C}°C"
可视化与集成:将温度数据推送到监控系统
单纯的命令行输出不够直观,我们可以将温度数据推送到 Prometheus、Grafana 或 Zabbix。
示例:给Prometheus用的Exporter脚本(Python)
#!/usr/bin/env python3
# filename: temp_exporter.py
# 在端口8000暴露温度指标,供Prometheus抓取
import subprocess
import time
from prometheus_client import start_http_server, Gauge
# 创建指标
temp_gauge = Gauge('server_cpu_temp', 'Current CPU temperature', ['host'])
def get_temp():
result = subprocess.run(['sensors'], capture_output=True, text=True)
# 简单提取数字
import re
temps = re.findall(r'\+(\d+)', result.stdout)
if temps:
return int(temps[0]) # 取第一个数值
return 0
if __name__ == '__main__':
start_http_server(8000)
while True:
temp = get_temp()
temp_gauge.labels('server1').set(temp)
time.sleep(15)
部署后访问 http://your-server:8000 即可看到Prometheus格式的指标,然后在Grafana中配置仪表盘。
常见问题与故障排除(附问答)
Q1:运行sensors后输出为空,或者提示“No sensors found”?
A:可能原因:
- 未安装驱动:运行
sudo sensors-detect并允许配置。 - 内核模块未加载:
sudo modprobe coretemp(CPU温度模块)。 - 虚拟机不支持:VMware/VirtualBox中通常不暴露硬件传感器,需使用vSphere API。
Q2:脚本在cron任务中无法获取温度?
A:cron环境可能缺少PATH,在脚本开头添加 export PATH=$PATH:/usr/bin:/sbin,并使用绝对路径调用sensors(如 /usr/bin/sensors)。
Q3:温度波动很大,可能导致频繁告警?
A:建议加上去抖动逻辑,例如连续两次超阈值才告警,或设置告警冷却时间(如5分钟内不重复告警)。
Q4:为什么我的服务器温度显示为0°C?
A:读取的传感器可能未正确识别,检查/sys/class/thermal/thermal_zone*/temp,可能单位是毫摄氏度,需要除以1000。
Q5:如何监控多个服务器的温度?
A:推荐使用集中式监控方案,如Zabbix Agent自动采集,或通过SSH远程执行脚本后汇总数据。
安全建议与最佳实践
- 最小权限原则:监控脚本不要以root身份运行,创建专用用户(如
monitor),仅给予读取传感器文件的权限。 - 日志轮转:使用
logrotate管理日志文件,防止磁盘写满。 - 免密码告警:若使用邮件告警,配置
ssmtp或postfix为无密码中继,避免泄露密码。 - 保护敏感信息:脚本中不要硬编码密码或API密钥,使用环境变量或配置文件。
- 监控脚本本身:设置一个心跳检测,如果脚本挂了,另一个脚本(如systemd timer)能重启它。
- 温度单位统一:所有采集点使用摄氏度(°C),并在告警信息中明确注明。
监控服务器温度的脚本并不复杂,但需要结合硬件特性、操作系统接口以及运维需求来精准设计,从简单的sensors读取,到集成Prometheus/Grafana的完整可视化方案,本文覆盖了从开发到生产的全流程,建议从小型脚本开始,逐步添加告警和日志,最终形成适合你环境的生产级监控系统。温度数据是服务器健康的第一道防线。