Difference between revisions of "Fan control scripts"

From ThinkWiki
Jump to: navigation, search
 
Line 1: Line 1:
'''sh script example'''
+
==Fan control shell scripts==
 +
===sh script example===
  
 
  #!/bin/sh
 
  #!/bin/sh
Line 21: Line 22:
 
  done
 
  done
  
'''sh script example with more features'''
+
===sh script with more features===
  
 
  #!/bin/sh
 
  #!/bin/sh
Line 76: Line 77:
 
   done
 
   done
  
'''init script example'''
+
===sh script with extra safety functionality ===
 +
ibm_acpi usually works well. But to rely on it completely, this script provides some extra safety functionality:
 +
# It catches verious signals and turns the fan on before it quits.
 +
# It turns off the fan under very strict conditions, leaving it on when unexpected errors occur.
 +
 
 +
#!/bin/sh
 +
 +
# july 2005 Erik Groeneveld, erik@cq2.nl
 +
# It makes sure the fan is on in case of errors
 +
# and only turns it off when all temps are ok.
 +
 +
IBM_ACPI=/proc/acpi/ibm
 +
THERMOMETER=$IBM_ACPI/thermal
 +
FAN=$IBM_ACPI/fan
 +
MAXTRIPPOINT=65
 +
MINTRIPPOINT=60
 +
TRIPPOINT=$MINTRIPPOINT
 +
 +
echo fancontrol: Thermometer: $THERMOMETER, Fan: $FAN
 +
echo fancontrol: Current `cat $THERMOMETER`
 +
echo fancontrol: Controlling temperatures between $MINTRIPPOINT and $MAXTRIPPOINT degrees.
 +
 +
# Make sure the fan is turned on when the script crashes or is killed
 +
trap "echo enable > $FAN; exit 0" HUP KILL INT ABRT STOP QUIT SEGV TERM
 +
 +
while [ 1 ];
 +
do
 +
        command=enable
 +
        temperatures=`sed s/temperatures:// < $THERMOMETER`
 +
        result=
 +
        for temp in $temperatures
 +
        do
 +
                test $temp -le $TRIPPOINT && result=$result.Ok
 +
        done
 +
        if [ "$result" = ".Ok.Ok.Ok.Ok.Ok.Ok.Ok.Ok" ]; then
 +
                command=disable
 +
                TRIPPOINT=$MAXTRIPPOINT
 +
        else
 +
                command=enable
 +
                TRIPPOINT=$MINTRIPPOINT
 +
        fi
 +
        echo $command > $FAN
 +
        # Temperature ramps up quickly, so pick this not too large:
 +
        sleep 5
 +
done
 +
 
 +
==Init script example==
  
 
  #! /bin/sh
 
  #! /bin/sh

Revision as of 00:45, 13 August 2005

Fan control shell scripts

sh script example

#!/bin/sh

MAXTEMP=50

while [ 1 ];
do
       fan=no

       for temp in `sed s/temperatures:// < /proc/acpi/ibm/thermal`
       do
               test $temp -gt $MAXTEMP && fan=yes
       done

       command='disable'
       test "$fan" = "yes" && command='enable'
       echo $command > /proc/acpi/ibm/fan

       sleep 20
done

sh script with more features

#!/bin/sh

# fan control-script
#
# based upon ibm-acpi 0.11 (experimental=1 !)
#
# eliminates anoying "fan always on" in battery mode
# works with hysteresis (DELTA) so that always-turn-on/turn-off is avoided
# fan acivates at MAXTEMP and cools down CPU, GPU etc. to MAXTEMP-DELTA than the fan is turned off
# furthermore detects if AC is on and gives back fan control to default behaviour than
#
# one can change MAXTEMP and DELTA to individual values
# but take care of your THINKPAD don`t melt it!
#
# have fun!
# mk 05.05.05

MAXTEMP=51
DELTA=4

SWITCHTEMP=$MAXTEMP

#make sure the script doesn't leave the fan off on error
trap "echo enable > /proc/acpi/ibm/fan" EXIT

while [ 1 ];
do
  for ac in `sed s/state:// < /proc/acpi/ac_adapter/AC/state`
    do
     if [ "$ac" = "off-line" ]; then
         fan=no
         for temp in `sed s/temperatures:// < /proc/acpi/ibm/thermal`
           do
             test $temp -gt $SWITCHTEMP && fan=yes
           done

         if [ "$fan" = "yes" ]; then
           command='enable'
           SWITCHTEMP=`expr $MAXTEMP - $DELTA`
         else
           SWITCHTEMP=$MAXTEMP
           command='disable'
         fi

       else # ac-adapter on -> set fan control to standard behaviour
         command='enable'
       fi

       echo $command > /proc/acpi/ibm/fan
       sleep 15
     done 
  done

sh script with extra safety functionality

ibm_acpi usually works well. But to rely on it completely, this script provides some extra safety functionality:

  1. It catches verious signals and turns the fan on before it quits.
  2. It turns off the fan under very strict conditions, leaving it on when unexpected errors occur.
#!/bin/sh

# july 2005 Erik Groeneveld, erik@cq2.nl
# It makes sure the fan is on in case of errors
# and only turns it off when all temps are ok.

IBM_ACPI=/proc/acpi/ibm
THERMOMETER=$IBM_ACPI/thermal
FAN=$IBM_ACPI/fan
MAXTRIPPOINT=65
MINTRIPPOINT=60
TRIPPOINT=$MINTRIPPOINT

echo fancontrol: Thermometer: $THERMOMETER, Fan: $FAN
echo fancontrol: Current `cat $THERMOMETER`
echo fancontrol: Controlling temperatures between $MINTRIPPOINT and $MAXTRIPPOINT degrees.

# Make sure the fan is turned on when the script crashes or is killed
trap "echo enable > $FAN; exit 0" HUP KILL INT ABRT STOP QUIT SEGV TERM

while [ 1 ];
do
       command=enable
       temperatures=`sed s/temperatures:// < $THERMOMETER`
       result=
       for temp in $temperatures
       do
               test $temp -le $TRIPPOINT && result=$result.Ok
       done
       if [ "$result" = ".Ok.Ok.Ok.Ok.Ok.Ok.Ok.Ok" ]; then
               command=disable
               TRIPPOINT=$MAXTRIPPOINT
       else
               command=enable
               TRIPPOINT=$MINTRIPPOINT
       fi
       echo $command > $FAN
       # Temperature ramps up quickly, so pick this not too large:
       sleep 5
done

Init script example

#! /bin/sh

N=/etc/init.d/fan

set -e

case "$1" in
 start)
       # make sure privileges don't persist across reboots
       if [ -d /var/run/fan ] && [ "x`ls /var/run/fan`" != x ]
       then
               touch -t 198501010000 /var/run/fan/*
       fi
       fan.sh &    # Script from above
       ;;
 stop|reload|restart|force-reload)
       killall fan.sh
       echo enable > /proc/acpi/ibm/fan
       ;;
 *)
       echo "Usage: $N {start|stop|restart|force-reload}" >&2
       exit 1
       ;;
esac

exit 0