Difference between revisions of "Fan control scripts"
| Line 1: | Line 1: | ||
| − | + | ==Fan control shell scripts== | |
| + | ===sh script example=== | ||
|   #!/bin/sh |   #!/bin/sh | ||
| Line 21: | Line 22: | ||
|   done |   done | ||
| − | + | ===sh script with more features=== | |
|   #!/bin/sh |   #!/bin/sh | ||
| Line 76: | Line 77: | ||
|     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: | ||
| + | # 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
Contents
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:
- 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
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
