시스템: 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
출력(그놈)
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
strings 가 포함되어 있지 않다는 것입니다 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에서 스크립트를 실행하려면 제거해야 하거나 일부 다른 수정이 필요할 가능성이 높습니다 . 내 솔루션은 최소한 온도 분석의 주요 문제를 해결합니다.