Debian 11下GPU功耗检测脚本问题:字符串与固定值比较报错
GPU功耗检测脚本的数值比较问题排查与解决
问题根源
原脚本中使用[ "${zet}" -gt 150 ]进行数值比较,但zet是通过bc -l计算得到的浮点数(例如162.75),而shell的-gt运算符仅支持整数比较,浮点数会被当作字符串处理,导致比较逻辑失效,甚至触发"integer expression expected"错误。
另外原脚本存在两处细节错误:
- 警告提示逻辑颠倒:功耗大于150时应提示高功耗,而非"SYSTEM DRAW LOW"
- 拼写错误:
WARRNING应为WARNING
修复方案
方案1:用bc直接做浮点数比较
利用bc支持浮点运算和比较的特性,通过输出结果判断条件是否成立:
#!/bin/sh clear a=$(nvidia-smi -q -i 0 | grep "Power Draw" | cut -c45-50) b=$(nvidia-smi -q -i 1 | grep "Power Draw" | cut -c45-50) c=$(nvidia-smi -q -i 2 | grep "Power Draw" | cut -c45-50) d=$(nvidia-smi -q -i 3 | grep "Power Draw" | cut -c45-50) zet=$( echo "$a" + "$b" + "$c" + "$d" | bc -l ) echo "SYSTEM DRAW:" "$zet" # 使用bc进行浮点数比较 if echo "$zet > 150" | bc -l | grep -q 1; then echo "WARNING - SYSTEM DRAW HIGH" else echo "OK" fi sleep 8 exit
方案2:将浮点数转为整数后比较
通过截断或四舍五入把浮点数转成整数,再用shell的整数比较运算符:
#!/bin/sh clear a=$(nvidia-smi -q -i 0 | grep "Power Draw" | cut -c45-50) b=$(nvidia-smi -q -i 1 | grep "Power Draw" | cut -c45-50) c=$(nvidia-smi -q -i 2 | grep "Power Draw" | cut -c45-50) d=$(nvidia-smi -q -i 3 | grep "Power Draw" | cut -c45-50) zet=$( echo "$a" + "$b" + "$c" + "$d" | bc -l ) echo "SYSTEM DRAW:" "$zet" # 四舍五入转整数,或用cut -d. -f1截断取整 zet_int=$(printf "%.0f" "$zet") if [ "$zet_int" -gt 150 ]; then echo "WARNING - SYSTEM DRAW HIGH" else echo "OK" fi sleep 8 exit
进阶优化:简化GPU功耗提取逻辑
原脚本重复执行nvidia-smi命令,可通过循环简化,同时用awk替代cut,避免因输出格式变化导致的提取错误:
#!/bin/sh clear total_power=0 # 遍历0-3号GPU,统一提取功耗数值 for gpu_id in 0 1 2 3; do # awk直接提取Power Draw后的数值(第三列),无需依赖固定列位置 power_val=$(nvidia-smi -q -i "$gpu_id" | grep "Power Draw" | awk '{print $3}') total_power=$(echo "$total_power + $power_val" | bc -l) done echo "SYSTEM DRAW: $total_power W" if echo "$total_power > 150" | bc -l | grep -q 1; then echo "WARNING - SYSTEM DRAW HIGH" else echo "OK" fi sleep 8 exit
内容的提问来源于stack exchange,提问作者Pepi48
相关产品推荐
相关产品推荐

