#! /bin/sh # Monitor battery via ACPI. On change in battery status (eg, charging, # discharging, battery below threshold) indicate this change in status # by signaling init that the power has changed. # # We signal init by creating /etc/powerstatus with a single character in # it, viz O(kay), F(ail -- no mains, on battery), L(ow battery), and # then sending SIGPWR to init. This runs /etc/init.d/powerfail (on a # Debian system -- configured in /etc/inittab) to handle the power # status changes appropriately. # # Written by Ewen McNeill , 2003/03/02 #--------------------------------------------------------------------------- # PATH=/sbin:/usr/sbin:/bin:/usr/bin export PATH CHECKINTERVAL="15"; # seconds # Return: O(kay), F(ail), L(ow) battery status get_powerstatus() { BATTERY_CHARGE=`acpi -b|head -1` STATUS="O"; # Assume on mains power if echo "${BATTERY_CHARGE}" | grep -q discharging; then STATUS="F"; # On battery power if echo "${BATTERY_CHARGE}" | grep -q "00:0[0-9]:[0-9][0-9] remaining"; then STATUS="L"; # Low on battery power fi fi echo "${STATUS}" } # Signal init of new power status. # Usage: signal_init {O|F|L} signal_init() { if [ -n "$1" ]; then echo "Telling init power status: $1" echo "$1" >/etc/powerstatus kill -PWR 1 fi } #--------------------------------------------------------------------------- # Mainline CURSTATUS="" while true; do echo `date` `acpi -b|sed 's/ */ /g; s/^ //g'` NEWSTATUS=`get_powerstatus` if [ "${NEWSTATUS}" != "${CURSTATUS}" ]; then signal_init "${NEWSTATUS}" fi CURSTATUS="$NEWSTATUS" sleep ${CHECKINTERVAL} done