Difference between revisions of "Fan control scripts"
| Line 151: | Line 151: | ||
exit 0 | exit 0 | ||
| + | |||
| + | |||
| + | |||
| + | ==Init script example for gentoo== | ||
| + | Assume one of the above control scripts is /usr/sbin/ibm-fancontrold, for gentoo use the following init script in /etc/init.d/ibm-fancontrol | ||
| + | |||
| + | |||
| + | #!/sbin/runscript | ||
| + | # 2005 Gilbert Tiefengruber | ||
| + | # Distributed under the terms of the GNU General Public License v2 | ||
| + | |||
| + | depend() { | ||
| + | need localmount | ||
| + | } | ||
| + | |||
| + | checkconfig() { | ||
| + | if [ ! -e /proc/acpi/ibm/fan ]; then | ||
| + | eerror "The ibm_acpi module must be loaded with (experimental=1)" | ||
| + | return 1 | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | start() { | ||
| + | checkconfig || return 1 | ||
| + | |||
| + | ebegin "Starting ibm-fancontrold" | ||
| + | start-stop-daemon --quiet -p /var/run/ibm-fancontrold.pid -m -b --start -a /usr/sbin/ibm-fancontrold | ||
| + | eend ${?} | ||
| + | } | ||
| + | |||
| + | stop() { | ||
| + | ebegin "Stopping ibm-fancontrold" | ||
| + | start-stop-daemon --stop --quiet -p /var/run/ibm-fancontrold.pid | ||
| + | eend ${?} | ||
| + | } | ||
Revision as of 09:52, 23 September 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 various 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
Init script example for gentoo
Assume one of the above control scripts is /usr/sbin/ibm-fancontrold, for gentoo use the following init script in /etc/init.d/ibm-fancontrol
#!/sbin/runscript # 2005 Gilbert Tiefengruber # Distributed under the terms of the GNU General Public License v2
depend() {
need localmount
}
checkconfig() {
if [ ! -e /proc/acpi/ibm/fan ]; then
eerror "The ibm_acpi module must be loaded with (experimental=1)"
return 1
fi
}
start() {
checkconfig || return 1
ebegin "Starting ibm-fancontrold"
start-stop-daemon --quiet -p /var/run/ibm-fancontrold.pid -m -b --start -a /usr/sbin/ibm-fancontrold
eend ${?}
}
stop() {
ebegin "Stopping ibm-fancontrold"
start-stop-daemon --stop --quiet -p /var/run/ibm-fancontrold.pid
eend ${?}
}
fanctrld
fanctrld is a daemon (written in C) that controls the Thinkpad's fan. The basic approach is to monitor both temperature and fan speed. The fan is enabled when a certain temperature is exceeded, and disabled when the BIOS slows down the fan below a certain speed.