
システム: Ubuntu 16.04.1 Xenial Xerus
こんにちは、
GPUファンの速度を制御するために使用するbashスクリプトに奇妙な問題が発生しました。
このスクリプトは、GPUが異なる温度範囲に達したときにGPUファンの速度を変更します。
パスワード:
#!/bin/bash
interval=5
while true; do
current_temp=`nvidia-settings -query GPUCoreTemp| grep gpu | perl -ne 'print $1 if /GPUCoreTemp.*?: (\d+)./;'`
if (("$current_temp" < 45)); then
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=40
elif (("$current_temp" > 45)) && (("$current_temp" < 60)); then
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=50
elif (("$current_temp" > 60)) && (("$current_temp" < 65)); then
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=60
elif (("$current_temp" > 65)) && (("$current_temp" < 70)); then
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=70
elif (("$current_temp" > 70)) && (("$current_temp" < 75)); then
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=80
elif (("$current_temp" > 75)); then
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=100
fi
sleep "$interval"
done
このスクリプトはUnity DE、Gnome、およびKDEで完全に機能しますが、XFCE4(デバッグ用)で同じコマンドを呼び出すと./nvautofan.sh
エラーが発生します。bash -x ./nvautofan.sh
Gnomeデバッグ出力(予想):
+ interval=5
+ true
++ perl -ne 'print $1 if /GPUCoreTemp.*?: (\d+)./;'
++ grep gpu
++ nvidia-settings -query GPUCoreTemp
+ current_temp=37 # Proper output
+ (( 37 < 45 ))
+ nvidia-settings -a '[gpu:0]/GPUFanControlState=1' -a '[fan:0]/GPUTargetFanSpeed=40'
Attribute 'GPUFanControlState' (LINUX-RIG:0[gpu:0]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (LINUX-RIG:0[fan:0]) assigned value 40.
+ sleep 5
# ...
nvidia-settings -query GPUCoreTemp
出力(GNOME)
Attribute 'GPUCoreTemp' (LINUX-RIG:0.0): 39.
'GPUCoreTemp' is an integer attribute.
'GPUCoreTemp' is a read-only attribute.
'GPUCoreTemp' can use the following target types: X Screen, GPU.
Attribute 'GPUCoreTemp' (LINUX-RIG:0[gpu:0]): 39.
'GPUCoreTemp' is an integer attribute.
'GPUCoreTemp' is a read-only attribute.
'GPUCoreTemp' can use the following target types: X Screen, GPU.
XFCE4デバッグ出力(機能なし)
+ interval=5
+ true
++ nvidia-settings -query GPUCoreTemp
++ grep gpu
++ perl -ne 'print $1 if /GPUCoreTemp.*?: (\d+)./;'
+ current_temp= # An error appeared here
+ (( < 45 ))
nvautofan.sh: line 15: ((: < 45: syntax error: operand expected (error token is "< 45")
+ (( > 45 ))
nvautofan.sh: line 17: ((: > 45: syntax error: operand expected (error token is "> 45")
+ (( > 60 ))
nvautofan.sh: line 19: ((: > 60: syntax error: operand expected (error token is "> 60")
+ (( > 65 ))
nvautofan.sh: line 21: ((: > 65: syntax error: operand expected (error token is "> 65")
+ (( > 70 ))
nvautofan.sh: line 23: ((: > 70: syntax error: operand expected (error token is "> 70")
+ (( > 75 ))
nvautofan.sh: line 25: ((: > 75: syntax error: operand expected (error token is "> 75")
+ sleep 5
# ...
nvidia-settings -query GPUCoreTemp
出力(XFCE)
Attribute 'GPUCoreTemp' (LINUX-RIG:0.0): 38.
'GPUCoreTemp' is an integer attribute.
'GPUCoreTemp' is a read-only attribute.
'GPUCoreTemp' can use the following target types: X Screen, GPU.
だから私はこの問題に直面してを使用して問題を解決しようとしましたが、sh ./nvautofan.sh
スクリプトフォルダにファイルを作成中にエラーが発生しました(スクリプトが機能しなくなっています)。
+ interval=5
+ true
+ nvidia-settings -query GPUCoreTemp
+ grep gpu
+ perl -ne print $1 if /GPUCoreTemp.*?: (\d+)./;
+ current_temp=
nvautofan.sh: 15: nvautofan.sh: cannot open 45: No such file
+
nvautofan.sh: 15: nvautofan.sh: : Permission denied
+
nvautofan.sh: 17: nvautofan.sh: : Permission denied
+
nvautofan.sh: 19: nvautofan.sh: : Permission denied
+
nvautofan.sh: 21: nvautofan.sh: : Permission denied
+
nvautofan.sh: 23: nvautofan.sh: : Permission denied
+
nvautofan.sh: 25: nvautofan.sh: : Permission denied
+ sleep 5
# ...
XFCEでスクリプトが正しく実行されるようにこの問題を解決するにはどうすればよいですか?
ありがとうございます。
答え1
問題は(何らかの理由で)XFCEの出力にnvidia-settings -query GPUCoreTemp
文字列が含まれていないことですgpu
。 GNOMEで実行されているのと同じコマンドの出力と比較して、最初の行セットのみを表示します。これはcurrent_temp
空で、後で算術拡張が失敗することを意味します。
以下のスクリプトを実行してもsh
問題は解決しません。
次のbash
スクリプトは、出力の最初の行の末尾にある数値を選択し、それを現在の温度として使用します(編集する:コメントの後に他のコマンドを使用するように修正されました.)
#!/bin/bash
function set_fan_speed {
local speed="$1"
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" \
-a "[fan:0]/GPUTargetFanSpeed=$speed"
}
interval=5
while true; do
current_temp="$( nvidia-smi -a |
grep -F 'GPU Current Temp' | awk '{ print $(NF-1) }' )"
if [[ -z "$current_temp" ]]; then
echo "Something isn't right, current_temp is empty" >&2
exit 1
fi
if (( current_temp < 45 )); then set_fan_speed 40
elif (( current_temp < 60 )); then set_fan_speed 50
elif (( current_temp < 65 )); then set_fan_speed 60
elif (( current_temp < 70 )); then set_fan_speed 70
elif (( current_temp < 75 )); then set_fan_speed 80
else set_fan_speed 100
fi
sleep "$interval"
done
読みやすくするために、関数に長いコマンドを置き、不要な算術テストを削除しました。私も健全性チェックを挿入しましたcurrent_temp
。
変更が必要ない場合、このスクリプトの将来の改善には、ファンの速度にまったく影響を与えないものが含まれる可能性があります。現在のファン速度を追跡し、set_fan_speed
不要なときに更新しないことは確実なアプローチです。
nvidia-settings
注:関数呼び出しが実際に実行されているかどうかは不明です。set_fan_speed
働く。[gpu:0]/
GNOMEとXFCEでスクリプトを実行するには、削除する必要があるか、他のいくつかの修正が必要になる可能性があります。私のソリューションは、少なくとも温度分析の主な問題を解決します。