求助:如何用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 } }
关键部分拆解
- 调用外部命令:PowerShell中执行带空格路径的外部程序,要用
&符号引导,比如& $nvidiaSmiPath,这和Bash里的处理逻辑类似,但语法细节有差异。 - CSV数据解析:用
ConvertFrom-Csv把每行CSV转换成对象,通过自定义Header命名属性,比直接按列索引取值更可靠——就算nvidia-smi后续调整输出列顺序,脚本也不会出错。 - 数据清洗:nvidia-smi输出的温度和利用率带单位(比如
50 C、80 %),用-replace正则替换去掉单位,再转成整数才能做数值比较。 - 重启权限:
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
相关产品推荐
相关产品推荐

