You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用PowerShell实现GPU温度/利用率触发系统重启

PowerShell实现GPU监控与自动重启方案

嘿,既然你Bash玩得6,那转PowerShell搞这个GPU监控重启逻辑其实没那么难~我给你写个完整的实现,顺便拆解下每部分的思路,帮你快速上手PowerShell的相关用法:

完整脚本

# 定义nvidia-smi的路径,方便后续维护修改
$nvidiaSmiPath = "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"

# 持续调用nvidia-smi,每5秒输出一次GPU监控数据(CSV格式)
& $nvidiaSmiPath --query-gpu=timestamp,name,pci.bus_id,temperature.gpu,utilization.gpu,utilization.memory --format=csv -l 5 |
ForEach-Object {
    # 跳过表头行(第一行是字段名,无需处理)
    if ($_ -match "^timestamp") { return }

    # 将CSV格式的单行数据转换为PowerShell对象,方便通过属性名访问数据
    $gpuData = $_ | ConvertFrom-Csv -Header "timestamp", "name", "pciBusId", "tempGpu", "utilGpu", "utilMemory"

    # 提取温度数值(去掉末尾的" C"单位)并转为整数
    $gpuTemp = [int]($gpuData.tempGpu -replace " C", "")
    # 提取GPU利用率数值(去掉末尾的" %"单位)并转为整数
    $gpuUtil = [int]($gpuData.utilGpu -replace " %", "")

    # 输出当前监控状态,方便调试查看
    Write-Host "[$(Get-Date)] GPU名称: $($gpuData.name) | 温度: $gpuTemp°C | 利用率: $gpuUtil%"

    # 判断触发重启的条件:GPU温度低于50℃,或者GPU利用率低于80%
    if ($gpuTemp -lt 50 -or $gpuUtil -lt 80) {
        Write-Host "触发重启条件!正在执行系统重启..."
        # 执行强制重启命令(测试阶段建议先注释这行,用Write-Host代替,避免误重启)
        Restart-Computer -Force
        # 重启后脚本无需继续运行,直接退出循环
        break
    }
}

关键部分拆解

  1. 调用外部命令:PowerShell中执行带空格路径的外部程序,要用&符号引导,比如& $nvidiaSmiPath,这和Bash里的处理逻辑类似,但语法细节有差异。
  2. CSV数据解析:用ConvertFrom-Csv把每行CSV转换成对象,通过自定义Header命名属性,比直接按列索引取值更可靠——就算nvidia-smi后续调整输出列顺序,脚本也不会出错。
  3. 数据清洗:nvidia-smi输出的温度和利用率带单位(比如50 C、80 %),用-replace正则替换去掉单位,再转成整数才能做数值比较。
  4. 重启权限:Restart-Computer -Force需要管理员权限才能执行,所以运行脚本时一定要右键PowerShell选择「以管理员身份运行」。

多GPU场景适配

如果你的机器有多块GPU,nvidia-smi会每行输出一块GPU的数据,上面的脚本会逐个检查,只要任意一块GPU满足条件就触发重启。如果需要调整逻辑(比如所有GPU都满足条件才重启),可以修改判断部分:

# 示例:收集所有GPU的状态,只有当所有GPU都满足条件时才重启
$gpuList = @()
& $nvidiaSmiPath --query-gpu=timestamp,name,pci.bus_id,temperature.gpu,utilization.gpu,utilization.memory --format=csv -l 5 |
ForEach-Object {
    if ($_ -match "^timestamp") { return }
    $gpuData = $_ | ConvertFrom-Csv -Header "timestamp", "name", "pciBusId", "tempGpu", "utilGpu", "utilMemory"
    $gpuTemp = [int]($gpuData.tempGpu -replace " C", "")
    $gpuUtil = [int]($gpuData.utilGpu -replace " %", "")
    $gpuList += @{
        Name = $gpuData.name
        Temp = $gpuTemp
        Util = $gpuUtil
    }
    Write-Host "[$(Get-Date)] GPU名称: $($gpuData.name) | 温度: $gpuTemp°C | 利用率: $gpuUtil%"
}

# 判断所有GPU是否都满足重启条件
$allMeetCondition = $gpuList | Where-Object { $_.Temp -ge 50 -and $_.Util -ge 80 } | Measure-Object | Select-Object -ExpandProperty Count
if ($allMeetCondition -ne $gpuList.Count) {
    Write-Host "所有GPU均满足重启条件!正在重启系统..."
    Restart-Computer -Force
}

测试提示

一定要先测试再正式使用! 把Restart-Computer -Force注释掉,换成Write-Host "测试:触发重启条件",确认监控逻辑正常后再恢复重启命令,避免误重启造成数据丢失。

内容的提问来源于stack exchange,提问作者codepoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:18