Skip to content

Instantly share code, notes, and snippets.

@jdekarske
Created April 2, 2024 21:39
Show Gist options
  • Select an option

  • Save jdekarske/0d65734446ed56122650a909dd5d60ca to your computer and use it in GitHub Desktop.

Select an option

Save jdekarske/0d65734446ed56122650a909dd5d60ca to your computer and use it in GitHub Desktop.
#!/bin/bash
# please don't put nonsense temperatures here, I don't check
mintemp=50
maxtemp=100
# found by running `sudo pwmconfig`
minspeed=10
maxspeed=255
GPUnum=0
interpolate_speed() {
local temp=$1
if [[ $temp -lt $mintemp ]]; then
local speed=$minspeed
elif [[ $temp -gt $maxtemp ]]; then
local speed=$maxspeed
else
local speed=$(( (minspeed * (maxtemp - temp) + maxspeed * (temp - mintemp)) / (maxtemp - mintemp) ))
fi
echo "$speed"
}
main() {
# my motherboard device is nct6798 found with `pwmconfig`
device=""
for hwmon in /sys/class/hwmon/hwmon*; do
if [ -f "$hwmon/name" ] && [ "$(cat "$hwmon/name")" = "nct6798" ]; then
device=$(basename "$hwmon")
break
fi
done
if [ -n "$device" ]; then
temperature=$(nvidia-smi -i $GPUnum --query-gpu=temperature.gpu --format=csv,noheader)
speed=$(interpolate_speed "$temperature")
# Set fan speed
fan_speed_file="/sys/class/hwmon/$device/pwm4"
fan_speed_file_enable="/sys/class/hwmon/$device/pwm4_enable"
if [ -e "$fan_speed_file" ] && [ -w "$fan_speed_file" ]; then
echo 1 > "$fan_speed_file_enable" # change to mode: manual
echo "$speed" > "$fan_speed_file"
# DEBUG
# echo "Fan speed set to $speed based on GPU temperature: $temperature°C"
else
echo "Failed to set fan speed. Fan speed file not found or not writable: $fan_speed_file"
echo "Are you sudo?"
exit 1
fi
else
echo "Device nct6798 not found."
exit 1
fi
}
while getopts "c:" opt; do
case $opt in
c)
if [ -z "$OPTARG" ]; then
echo "-c option requires an argument." >&2
exit 1
else
while true; do
sleep "$OPTARG"
main
done
fi
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
main
#!/bin/bash
SERVICE_FILE="/etc/systemd/system/gpufan.service"
FAN_SCRIPT="<fan-dir>/fan_control.sh"
cat <<EOL > "$SERVICE_FILE"
[Unit]
Description=Fan Control Service
[Service]
Type=simple
ExecStart="$FAN_SCRIPT" -c 10
[Install]
WantedBy=multi-user.target
EOL
# Reload systemd manager configuration
systemctl daemon-reload
systemctl start gpufan.service
systemctl enable gpufan.service
echo "gpufan service has been configured. Reboot to apply changes."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment