Created
April 2, 2024 21:39
-
-
Save jdekarske/0d65734446ed56122650a909dd5d60ca to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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