Pull to refresh

Таймер для выключения комьютера в ubuntu

Так уж получилось, что люблю спать при просмотре фильмов или ТВ. Перейдя на Ubuntu был огорчен отсутствием таймера на выключение, которым можно было бы управлять с самодельного пульта +Lirc.
Решение вышло похожим на стандартный таймер 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 

покажет на экране текущее время.

Кстати, скрипт можно использовать и без пульта, например, задав ему любую клавишу на клавиатуре.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.