#!/bin/bash minFanSpeed=59; #минимальные обороты (от 0 до 255) # график изменения оборотов для HDD # температура=>скорость(% от max) hddSet[38]=125; hddSet[44]=169; hddSet[47]=210; hddSet[51]=255; # график изменения оборотов для CPU # температура=>скорость(% от max) cpuSet[38]=59; cpuSet[48]=66; cpuSet[55]=100; cpuSet[60]=160; cpuSet[68]=255; #выставляем скорость function setFanSpeed { echo ${1} > /sys/class/hwmon/hwmon7/pwm3 } function getMaxHddTemp { echo $(($(cat /sys/class/hwmon/hwmon[3,4,5,6]/temp1_input|sort -n|tail -1)/1000)); } function getCpuTemp { echo $(($(cat /sys/class/hwmon/hwmon2/temp1_input)/1000)) } function calcTempHdd { prev=0; for i in "${!hddSet[@]}" do key=$i; val=${hddSet[$i]}; #меньше первого значения if [[ $1 -lt $key && $prev -eq 0 ]] then ar=$2 echo 0; return; fi; dots=${prev}":"${hddSet[$prev]}":"${key}":"${val}; #меньше не первого значения if [[ $1 -lt $key && $prev -gt 0 ]] then echo $dots; return; fi; prev=$key; done echo $dots; } function calcTempCpu { prev=0; for i in "${!cpuSet[@]}" do key=$i; val=${cpuSet[$i]}; #меньше первого значения if [[ $1 -lt $key && $prev -eq 0 ]] then ar=$2 echo 0; return; fi; dots=${prev}":"${cpuSet[$prev]}":"${key}":"${val}; #меньше не первого значения if [[ $1 -lt $key && $prev -gt 0 ]] then echo $dots; return; fi; prev=$key; done echo $dots; } # аргументы [x1:y1:x2:y2, x], вернет Y=(kx+b) function linear { dots=$1 [[ "$dots" == "0" ]] && echo "0" && return; x1=$(echo $dots | cut -d ":" -f1); y1=$(echo $dots | cut -d ":" -f2); x2=$(echo $dots | cut -d ":" -f3); y2=$(echo $dots | cut -d ":" -f4); x=$2; # y=kx+b k=$(awk "BEGIN {printf \"%.2f\",(${y2}-${y1})/(${x2}-${x1})}"); b=$(awk "BEGIN {printf \"%.2f\",(${y1}-(${k}*${x1}))}"); y=$(awk "BEGIN {printf \"%.0f\",(${k}*${x})+(${b})}"); #не больше 255 [[ $y -ge 255 ]] && y=255; echo $y; } #составим таблицу скоростей для HDD for ((i=0; i<101; i++)) do pwmSpeed=$(linear $(calcTempHdd $i) $i); if [[ $pwmSpeed -gt 0 ]] then echo "TempHDD:"$i" = "${pwmSpeed}"/255"; fi; hddTable[$i]=$pwmSpeed; done #составим таблицу скоростей для процессора for ((i=0; i<101; i++)) do pwmSpeed=$(linear $(calcTempCpu $i) $i); if [[ $pwmSpeed -gt 0 ]] then echo "TempCPU:"$i" = "${pwmSpeed}"/255"; fi; cpuTable[$i]=$pwmSpeed; done #включаем ручное управление echo 1 > /sys/class/hwmon/hwmon7/pwm3_enable #ставим на максималку echo 255 > /sys/class/hwmon/hwmon7/pwm3 while true do hddTemp=$(getMaxHddTemp); cpuTemp=$(getCpuTemp); echo "TEMP hdd="${hddTemp}";cpu="${cpuTemp}; echo "SPEED for hdd="${hddTable[$hddTemp]}/255";SPEED for cpu="${cpuTable[$cpuTemp]}"/255"; [[ ${hddTable[$hddTemp]} -gt ${cpuTable[$cpuTemp]} ]] && needPWM=${hddTable[$hddTemp]} || needPWM=${cpuTable[$cpuTemp]}; echo "set ${needPWM}/255"; setFanSpeed $needPWM; echo "-------------------------------------------------"; sleep 35 done