Проблема в том, что (по какой-то причине) вывод команды nvidia-settings -query GPUCoreTemp
под XFCE не содержит строки gpu
. Он показывает только первый набор строк по сравнению с выводом той же команды, запущенной под GNOME. Это означает, что current_temp
будет пустым, и последующие арифметические разложения будут неудачными.
Запуск скрипта под sh
не исправит ситуацию.
Следующий сценарий bash
вместо этого выберет число в конце первой строки вывода и будет использовать его в качестве текущей температуры (Edit: изменено для использования другой команды после комментариев).
#!/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. Мое решение, по крайней мере, решает основную проблему разбора температуры.