ci sono diversi programmi che tengono sotto controllo lo stato della batteria e che eseguono comandi quando la batteria è troppo scarica, ad esempio gtkmm e xfce4-battery, ma non li ho voluti usare perchè ogni tanto mi capita di usare il portatile senza X avviato
il mio metodo è distinto in 3 parti:
1. uno script bash
2. un programmino in c++ e gtkmm
3. l'istruzione da inserire in cron
1. script bash
ho deciso quindi di scrivere un piccolo scriptino in bash che controlla lo stato della batteria, nel mio caso con acpi; quando la batteria scende sotto la soglia WARNING_PERCENT emette un suono di avvertimento e cerca di fare partire sul display 0 un programmino in C++ che chiede se si vuole spegnere il portatile (in caso affermativo killa X e spegne il pc)
per spegnere il pc bisogna avere installato sudo e avere assegato all'utente che usa X il permesso di usare shutdown senza password (so che è pericoloso, ma lo preferisco a lanciare un programma su X scrotto da me con root)
codice:
#!/bin/bash
#file: /usr/bin/check_battery_state
WARNING_PERCENT=4
REBOOT_PERCENT=2
MUSIC_PLAYER="aplay"
PATH_TO_WARNING_WAV="/usr/share/sounds/alarms/siren.wav"
PATH_TO_ALARM_WAV="/usr/share/sounds/alarms/gong.wav"
SECONDS_BEFORE_REBOOT=10
function start_halt()
{
killall X
sudo /sbin/shutdown -h now
}
# This part of the script use acpi on my laptop: change if needed
STATE=`cat /proc/acpi/battery/BAT0/state | grep "charging state:" | awk '{print $3}'`
PURCENT=`/usr/bin/get_battery_percent | bc -l`
if [ "$STATE" = "discharging" ];
then
if [ $PURCENT -lt $REBOOT_PERCENT ];
then
$MUSIC_PLAYER $PATH_TO_ALARM_ALARM
sleep $SECONDS_BEFORE_REBOOT
start_halt
elif [ $PURCENT -lt $WARNING_PERCENT ];
then
$MUSIC_PLAYER $PATH_TO_WARNING_WAV &
#NOTE: ask_windows is a small c++ program written from me that ask
# if the user will really reboot the machine
REBOOT=`DISPLAY=:0 ask_window`
if [ $REBOOT = 1 ];
then
sleep 2
start_halt
fi
fi
fi
lo script è da copiare in /usr/bin/check_battery_state
2. programmino in C++ e gtkmm
il programmino in C++ non è niente di speciale, potete scaricare i sorgenti qui (non posto tutto il codice perchè sarebbe un po' troppo lungo)
l'unica dipendenza dovrebbe essere gtkmm-2.4 (il porting di gtk-2.4 per c++)
per chi non volesse installare questo programmino basta commentare nello script di prima le linee
codice:
REBOOT=`DISPLAY=:0 ask_window`
if [ $REBOOT = 1 ];
then
sleep 2
start_halt
fi
in maniera da sentire solamente il suono di avviso, oppure scrivere un altro programmino che abbia come output sulla shell 1 se l'utente sceglie di rebootare o 0 se sceglie il contrario
3. istruzione per cron
avrò provato non so quanti modi diversi per richiamare check_battery_state da /etc/crontab e non ci sono riuscito..
l'unica soluzione che ho trovato è stata quella di usare il crontab dell'utente che usa X (da me non è un problema perchè il portatile lo uso solo io) con
codice:
# crontab -u nome_utente -e
codice:
*/1 * * * * /usr/bin/check_battery_state
in questo modo lo script viene eseguito ogni minuto
è tutto