监控服务器温度的脚本如何写

wen 实用脚本 1

从零到实战的完整指南

目录导读

  1. 为什么需要监控服务器温度?
  2. 温度监控的核心原理与数据来源
  3. 基础脚本:Linux下的温度采集(使用lm-sensors
  4. 进阶脚本:自动告警与日志记录
  5. 多平台适配:Windows与树莓派温度监控
  6. 可视化与集成:将温度数据推送到监控系统
  7. 常见问题与故障排除(附问答)
  8. 安全建议与最佳实践

为什么需要监控服务器温度?

服务器温度一旦过高,轻则导致性能降频(CPU/GPU throttling),重则引发硬件损坏、数据丢失甚至火灾,根据数据中心经验,温度每升高10°C,硬件故障率约增加一倍。编写一个温度监控脚本是运维工程师的必修课,它能帮助你在温度异常时第一时间获得通知,避免灾难性后果。

监控服务器温度的脚本如何写

核心监控目标

  • CPU核心温度(Core Temp)
  • GPU温度(如有独立显卡)
  • 硬盘/SSD温度(SMART数据)
  • 主板传感器温度(如南桥、北桥)

温度监控的核心原理与数据来源

温度数据并非凭空而来,它依赖于硬件传感器和操作系统接口,常见的温度数据源包括:

数据源 Linux Windows 说明
CPU /sys/class/thermal/thermal_zone*/templm-sensors WMI或第三方工具(如OpenHardwareMonitor) 读取核心温度
GPU nvidia-smi(NVIDIA)或 radeontop(AMD) GPU-Z API或PowerShell 显卡温度
硬盘 smartctl(smartmontools) WMICrystalDiskInfo 磁盘温度
主板 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"

可视化与集成:将温度数据推送到监控系统

单纯的命令行输出不够直观,我们可以将温度数据推送到 PrometheusGrafanaZabbix

示例:给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远程执行脚本后汇总数据。


安全建议与最佳实践

  1. 最小权限原则:监控脚本不要以root身份运行,创建专用用户(如monitor),仅给予读取传感器文件的权限。
  2. 日志轮转:使用 logrotate 管理日志文件,防止磁盘写满。
  3. 免密码告警:若使用邮件告警,配置ssmtppostfix为无密码中继,避免泄露密码。
  4. 保护敏感信息:脚本中不要硬编码密码或API密钥,使用环境变量或配置文件。
  5. 监控脚本本身:设置一个心跳检测,如果脚本挂了,另一个脚本(如systemd timer)能重启它。
  6. 温度单位统一:所有采集点使用摄氏度(°C),并在告警信息中明确注明。

监控服务器温度的脚本并不复杂,但需要结合硬件特性、操作系统接口以及运维需求来精准设计,从简单的sensors读取,到集成Prometheus/Grafana的完整可视化方案,本文覆盖了从开发到生产的全流程,建议从小型脚本开始,逐步添加告警和日志,最终形成适合你环境的生产级监控系统。温度数据是服务器健康的第一道防线

抱歉,评论功能暂时关闭!