监控风扇转速的脚本如何编写

wen 实用脚本 1

本文目录导读:

监控风扇转速的脚本如何编写

  1. Linux 系统
  2. Windows 系统
  3. 跨平台 Python 脚本
  4. 高级功能脚本
  5. 使用说明

我来帮你编写监控风扇转速的脚本,根据不同操作系统,这里提供几种方案:

Linux 系统

使用 lm-sensors(推荐)

#!/bin/bash
# fan_monitor.sh - 监控风扇转速
# 安装依赖(如果需要)
# sudo apt-get install lm-sensors
# sudo sensors-detect
# 风扇速度阈值
FAN_THRESHOLD=500  # RPM
while true; do
    # 获取风扇转速
    fan_speed=$(sensors | grep -i "fan" | awk '{print $2}' | head -1)
    # 检查是否为空
    if [ -z "$fan_speed" ]; then
        echo "无法获取风扇信息"
    else
        echo "当前风扇转速: ${fan_speed} RPM"
        # 检查是否低于阈值
        if [ "$fan_speed" -lt "$FAN_THRESHOLD" ] 2>/dev/null; then
            echo "警告: 风扇转速过低!"
            # 可以在这里添加发送警报的代码
        fi
    fi
    sleep 5
done

读取 /sys/class 接口

#!/bin/bash
# fan_monitor_sys.sh
# 查找所有风扇设备
for fan in /sys/class/hwmon/hwmon*/fan*_input; do
    if [ -f "$fan" ]; then
        speed=$(cat "$fan")
        name=$(echo "$fan" | grep -oP 'hwmon\d+/fan\d+')
        echo "$name: ${speed} RPM"
    fi
done
# 持续监控
while true; do
    clear
    echo "=== 风扇监控 ==="
    echo "时间: $(date)"
    echo ""
    for fan in /sys/class/hwmon/hwmon*/fan*_input; do
        if [ -f "$fan" ]; then
            speed=$(cat "$fan")
            name=$(echo "$fan" | grep -oP 'fan\d+')
            echo "风扇 $name: ${speed} RPM"
        fi
    done
    sleep 2
done

Windows 系统

PowerShell 脚本

# fan_monitor.ps1
# 使用WMI获取风扇信息
function Get-FanSpeed {
    try {
        # 获取风扇信息
        $fans = Get-WmiObject -Namespace "root\wmi" -Class "FanSpeed" -ErrorAction Stop
        if ($fans) {
            foreach ($fan in $fans) {
                $speed = $fan.CurrentSpeed
                Write-Host "风扇 $($fan.InstanceName): ${speed} RPM"
                # 阈值检查
                if ($speed -lt 500) {
                    Write-Host "警告: 风扇转速过低!" -ForegroundColor Red
                }
            }
        } else {
            Write-Host "未检测到风扇信息"
        }
    }
    catch {
        Write-Host "无法访问风扇信息: $($_.Exception.Message)"
    }
}
# 持续监控
while ($true) {
    Clear-Host
    Write-Host "=== 风扇监控 ==="
    Write-Host "时间: $(Get-Date)"
    Write-Host ""
    Get-FanSpeed
    Start-Sleep -Seconds 5
}

使用 SpeedFan 命令行工具

@echo off
REM fan_monitor.bat
REM 需要先安装 SpeedFan:https://www.almico.com/speedfan.php
:loop
cls
echo === 风扇监控 ===
echo 时间: %date% %time%
echo.
REM 使用 SpeedFan 命令行
speedfan /s
REM 或者读取日志文件
if exist "C:\Program Files (x86)\SpeedFan\sf_log.csv" (
    type "C:\Program Files (x86)\SpeedFan\sf_log.csv" | findstr "FAN"
)
ping -n 5 127.0.0.1 > nul
goto loop

跨平台 Python 脚本

#!/usr/bin/env python3
# fan_monitor.py
import platform
import subprocess
import time
import re
def get_linux_fan_speed():
    """Linux系统获取风扇转速"""
    try:
        # 使用sensors命令
        result = subprocess.run(['sensors'], capture_output=True, text=True)
        if result.returncode == 0:
            fans = []
            for line in result.stdout.split('\n'):
                if 'fan' in line.lower():
                    match = re.search(r'(\d+)\s*RPM', line)
                    if match:
                        fans.append(int(match.group(1)))
            return fans
    except:
        pass
    return []
def get_windows_fan_speed():
    """Windows系统获取风扇转速"""
    try:
        import wmi
        c = wmi.WMI(namespace="root\\wmi")
        fans = []
        for fan in c.FanSpeed():
            fans.append(fan.CurrentSpeed)
        return fans
    except:
        pass
    return []
def main():
    """主监控函数"""
    system = platform.system().lower()
    print(f"风扇监控 - 运行在 {system}")
    print("=" * 40)
    while True:
        if system == 'linux':
            fan_speeds = get_linux_fan_speed()
        elif system == 'windows':
            fan_speeds = get_windows_fan_speed()
        else:
            print("不支持的操作系统")
            break
        if fan_speeds:
            for i, speed in enumerate(fan_speeds):
                print(f"风扇 {i+1}: {speed} RPM")
                # 阈值报警
                if speed < 500:
                    print(f"⚠ 警告: 风扇 {i+1} 转速过低!")
        else:
            print("无法获取风扇信息")
        print("-" * 40)
        time.sleep(5)
if __name__ == "__main__":
    main()

高级功能脚本

带日志记录和报警的完整脚本

#!/bin/bash
# fan_monitor_complete.sh
# 配置
LOG_FILE="/var/log/fan_monitor.log"
THRESHOLD=500
ALERT_EMAIL="admin@example.com"
# 初始化日志
init_log() {
    touch "$LOG_FILE"
    echo "===== 风扇监控日志 - $(date) =====" >> "$LOG_FILE"
}
# 记录日志
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 发送警报
send_alert() {
    local message="$1"
    echo "$message" | mail -s "风扇转速警报" "$ALERT_EMAIL"
}
# 监控函数
monitor_fans() {
    while true; do
        # 获取风扇信息
        sensors_output=$(sensors 2>/dev/null)
        if [ $? -ne 0 ]; then
            log "错误: 无法运行sensors命令"
            sleep 10
            continue
        fi
        # 解析风扇信息
        echo "$sensors_output" | grep -i "fan" | while read line; do
            speed=$(echo "$line" | grep -oP '\d+' | head -1)
            name=$(echo "$line" | awk -F: '{print $1}')
            if [ -n "$speed" ]; then
                log "风扇 $name: ${speed} RPM"
                # 检查阈值
                if [ "$speed" -lt "$THRESHOLD" ]; then
                    log "警告: 风扇 $name 转速过低! (${speed} < ${THRESHOLD})"
                    send_alert "风扇 $name 转速过低! 当前: ${speed} RPM"
                fi
            fi
        done
        sleep 5
    done
}
# 主函数
main() {
    # 检查权限
    if [ "$(id -u)" -ne 0 ]; then
        echo "请以root用户运行此脚本"
        exit 1
    fi
    # 初始化
    init_log
    log "开始监控风扇"
    # 处理信号
    trap "log '监控停止'; exit 0" SIGINT SIGTERM
    # 启动监控
    monitor_fans
}
main

使用说明

安装依赖

Linux:

# Ubuntu/Debian
sudo apt-get install lm-sensors
sudo sensors-detect
# CentOS/RHEL
sudo yum install lm_sensors
sudo sensors-detect

Windows:

  • 需要管理员权限运行PowerShell
  • 可能需要安装SpeedFan

运行脚本

# Linux
chmod +x fan_monitor.sh
./fan_monitor.sh
# Python版本
python3 fan_monitor.py
# Windows PowerShell
Set-ExecutionPolicy RemoteSigned
.\fan_monitor.ps1

选择适合你系统的版本,必要时调整阈值和告警设置。

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