Так уж получилось, что люблю спать при просмотре фильмов или ТВ. Перейдя на Ubuntu был огорчен отсутствием таймера на выключение, которым можно было бы управлять с самодельного пульта +Lirc.
Решение вышло похожим на стандартный таймер AverTV.
Для работы скриптов нужно сделать возможным запуск /sbin/shutdown от лица нашего пользователя без ввода пароля. И установить пакет aosd_cat, если он у вас не стоит.
Таймер будет составлять из двух модулей:
Первый — демон, следит за состоянием таймера и в нужно время выключает компьютер. Когда до выключения компьютера остается менее трех минут в правом углу экрана появляется сообщение. Когда до выключения сообщения остается менее минуты сообщение перемещается на середину экрана и меняет свой цвет.
Так как функции таймера показалось мало для постоянно запущенного процесса, в него была добавлена функция отображения на экран произвольного текста, но об этом позже.
Листинг osd_demon.sh
Второй — скрипт, запустив который несколько раз можно выставить таймер.
Листинг my_power.sh
Как видно из скрипта, запустив первый раз вы получите сообщение «Выключение не установлено», повторный запуск даст установку таймера на 30 минут и сообщение «Выключение через 30 минут” и т далее…
Были проблемы с автозагрузкой демона, поэтому пришлось сделать скрипт для его загрузки
листинг start_dem.sh
все скрипты делаем исполняемыми.
start_dem.sh добавляем в автозагрузку.
Далее добавляем в .lircrc:
begin
prog = irexec
button = Power
config = home/%username%/scripts/power/my_power.sh &
end
Теперь при нажатии на кнопку 'Power' на пульте можно выставить таймер на выключения.
Чуть не забыл, демон может отображать любой текст, для этого надо добавить его в файлик
.tmp_showmsg, лежащий в одной с демоном папке.
Например:
покажет на экране текущее время.
Кстати, скрипт можно использовать и без пульта, например, задав ему любую клавишу на клавиатуре.
Решение вышло похожим на стандартный таймер AverTV.
Для работы скриптов нужно сделать возможным запуск /sbin/shutdown от лица нашего пользователя без ввода пароля. И установить пакет aosd_cat, если он у вас не стоит.
Таймер будет составлять из двух модулей:
Первый — демон, следит за состоянием таймера и в нужно время выключает компьютер. Когда до выключения компьютера остается менее трех минут в правом углу экрана появляется сообщение. Когда до выключения сообщения остается менее минуты сообщение перемещается на середину экрана и меняет свой цвет.
Так как функции таймера показалось мало для постоянно запущенного процесса, в него была добавлена функция отображения на экран произвольного текста, но об этом позже.
Листинг osd_demon.sh
CONFIGPATH="$HOME/scripts/power"
## сохраняем Pid скрипта в файл
lastpid=$(cat $CONFIGPATH/.osd_demon.pid)
echo $$ >$CONFIGPATH/.osd_demon.pid
## если на экране отображается текст, то убиваем его
if ps ax | grep -v grep | grep $lastpid > /dev/null
then
kill -9 $lastpid
fi
while true
do
if pidof aosd_cat > /dev/null
then
sleep 0.2
else
sleeptime=$(cat $CONFIGPATH/.tmp_poweroff_press_time)
nowtime=$(date +%s)
timediff=$(($sleeptime-$nowtime))
if (($timediff>0));
then
min=$(($timediff/60))
if (($min<5 && $min>=1)); then
sec=$(($timediff-$min*60))
echo -n "Выключение через $min:$sec" | aosd_cat -n "Arial Black 24" -R green -p 1 -x 350 -y 30 -u 20000 -o 0 -f 0 &
fi
if (($min<1 && $min>-1)); then
l_procn=$(pidof osd_cat)
read -r -a l_words <<< "$l_procn"
l_i=0
while [ ${l_words[$l_i]} ]
do
kill -9 ${l_words[$l_i]}
l_i=$((l_i+1))
done
sec=$(($timediff-$min*60))
echo -n "Выключение через $sec секунд" | aosd_cat -n "Arial Black 24" -R red -p 3 -x 350 -y 30 -u 700 -o 0 -f 0 &
if ((sec<10)); then
sudo /sbin/shutdown -h now
fi
fi
fi
show=$(cat $CONFIGPATH/.tmp_showmsg)
ms=${#show}
if ((ms>0)) ; then
echo -n "$show" | aosd_cat $msg -n "Arial Black 36" -R green -p 1 -x 350 -y 30 -u 10000 &
echo > $CONFIGPATH/.tmp_showmsg
fi
fi
sleep 2
done
Второй — скрипт, запустив который несколько раз можно выставить таймер.
Листинг my_power.sh
#! /bin/bash
CONFIGPATH="$HOME/scripts/power"
lastpid=$(cat $CONFIGPATH/.my_power.pid)
echo $$ >$CONFIGPATH/.my_power.pid
if ps ax | grep -v grep | grep $lastpid > /dev/null
then
kill -9 $lastpid >/dev/null
fi
l_procn=$(pidof aosd_cat)
read -r -a l_words <<< "$l_procn"
l_i=0
while [ ${l_words[$l_i]} ]
do
kill -9 ${l_words[$l_i]}
l_i=$((l_i+1))
done
lasttime=$(cat $CONFIGPATH/.tmp_poweroff_press_time)
nowtime=$(date +%s)
timediff=$(($lasttime-$nowtime))
runttime=$(cat $CONFIGPATH/.tmp_poweroff_run_time)
diff=$(($nowtime-$runttime))
echo $nowtime > $CONFIGPATH/.tmp_poweroff_run_time
if (($diff<10));
then
min=$((($timediff+15)/60))
if (($min<30));
then
echo $((nowtime+30*60)) > $CONFIGPATH/.tmp_poweroff_press_time
echo $nowtime > $CONFIGPATH/.tmp_poweroff_run_time
echo -n "Выключение через 30 минут" | aosd_cat -n 'Arial Black 24' -R green -p 1 -x 350 -y 30 &
fi
if (($min>=30 && $min<60));
then
echo $((nowtime+60*60)) > $CONFIGPATH/.tmp_poweroff_press_time
echo $nowtime > $CONFIGPATH/.tmp_poweroff_run_time
echo -n "Выключение через 60 минут" | aosd_cat -n 'Arial Black 24' -R green -p 1 -x 350 -y 30 &
fi
if (($min>=60 && $min<90));
then
echo $((nowtime+90*60)) > $CONFIGPATH/.tmp_poweroff_press_time
echo $nowtime > $CONFIGPATH/.tmp_poweroff_run_time
echo -n "Выключение через 90 минут" | aosd_cat -n 'Arial Black 24' -R green -p 1 -x 350 -y 30 &
fi
if (($min>=90 && $min<120));
then
echo $((nowtime+120*60)) > $CONFIGPATH/.tmp_poweroff_press_time
echo $nowtime > $CONFIGPATH/.tmp_poweroff_run_time
echo -n "Выключение через 120 минут" | aosd_cat -n 'Arial Black 24' -R green -p 1 -x 350 -y 30 &
fi
if (($min>=120));
then
echo $((nowtime-100)) > $CONFIGPATH/.tmp_poweroff_press_time
echo $((nowtime-100)) > $CONFIGPATH/.tmp_poweroff_run_time
echo -n "Отменить выключение" | aosd_cat -n 'Arial Black 24' -R green -p 1 -x 350 -y 30 &
fi
else
if (($timediff>0));
then
min=$(($timediff/60))
if (($min>0)); then
echo -n "Выключение через $min минут" | aosd_cat -n 'Arial Black 24' -R green -p 1 -x 350 -y 30 &
fi
else
echo -n "Выключение не установлено" | aosd_cat -n 'Arial Black 24' -R green -p 1 -x 350 -y 30 &
fi
fi
exit 0
Как видно из скрипта, запустив первый раз вы получите сообщение «Выключение не установлено», повторный запуск даст установку таймера на 30 минут и сообщение «Выключение через 30 минут” и т далее…
Были проблемы с автозагрузкой демона, поэтому пришлось сделать скрипт для его загрузки
листинг start_dem.sh
bash /home/%username%/scripts/power/osd_demon.sh &
disown %1
все скрипты делаем исполняемыми.
start_dem.sh добавляем в автозагрузку.
Далее добавляем в .lircrc:
begin
prog = irexec
button = Power
config = home/%username%/scripts/power/my_power.sh &
end
Теперь при нажатии на кнопку 'Power' на пульте можно выставить таймер на выключения.
Чуть не забыл, демон может отображать любой текст, для этого надо добавить его в файлик
.tmp_showmsg, лежащий в одной с демоном папке.
Например:
echo date +%T > /home/%username%/scripts/power/.tmp_showmsg
покажет на экране текущее время.
Кстати, скрипт можно использовать и без пульта, например, задав ему любую клавишу на клавиатуре.