Главная >> Инструкции >> Будильник на Bash

Будильник на Bash

Когда-то, уже достаточно давно мне понадобился будильник, достаточно громкий, чтобы поднять мертвого, достаточно разнообразный, чтобы не надоедать и при этом достаточно тяжело выключаемый, чтобы не делать этого "на автомате". Всем этим требованиям отлично соответствовал персональный компьютер и решение этой несложной задачи было найдено при помощи интернет-радио и двух консольных утилит: cron и rtcwake.

Время шло, импровизированный “будильник” великолепно справлялся с задачей, хотя и оставался при этом не самым удобным в плане эксплуатации, все-таки для изменения его приходилось править конфиги, а команду на засыпание вводить в терминал напрямую. Так продолжалось почти год, но совсем недавно один знакомый, недавно перешедший на Ubuntu Linux, попросил рассказать ему о таком чудесном явлении, как командная строка и ее интерпретаторе bash. Поскольку обучение даже самым азам программирование в отрыве от практики по моему глубокому убеждению бесполезно, была написана написана статья, которую я представляю вашему вниманию.

Несмотря на то, что основной целью является все-таки обучение азам работы с bash, скрипт, получающийся в итоге вполне можно использовать и по прямому назначению: то есть в качестве будильника.


Содержание статьи

Что такое Bash

Одной из самых интересных особенностей операционных систем на базе GNU/Linux является bash. Bash это интерпретатор командной строки, по сути, скриптовый язык программирования, на котором вполне возможно писать достаточно сложные программы, так называемы shell-скрипты или сценарии. Естественно, что на фоне более “серьезных” собратьев по семейству интерпретируемых языков, подобных java или python, функциональность bash  смотрится куда более бедно, но зато он плотно интегрирован в саму систему, а это означает, что значительно проще наладить взаимодействие между ним и многими системными утилитами.

Что нам необходимо

С тех заданием все просто: нам необходим простой, надежный, громкий и разнообразный будильник, который сможет поднять мертвеца. И написан он должен быть исключительно на Bash, то есть системными средствами Linux.

Инструменты:

  • Bash - это, я думаю, понятно любому, интерпретатор командной строки, часть любого Linux - дистрибутива.
  • rtcwake  - встроенный в ядро инструмент, позволяющий использовать драйвер для RTC (Real Time Clock), поддерживающий стандартные флаги для просыпания.
  • cron - планировщик задач. Уже установлен в большинстве дистрибутивов.

Создание будильника на Bash

Для начала изготовим скрипт, представляющий собой сигнал будильника. Создаем папку wakeupdude (название строго индивидуально и отражает ваше чувство юмора (да, у меня все с ним плоховато) и серьезность отношения к поставленной задаче), в этой папке создаем файл alarm.sh.

Содержимое файла может быть различным, но я решил, что моим будильником будет любимая интернет-радиостанция, поэтому в моем случае все выглядит так:

#! /bin/bash

cromium-browser https://radio.yandex.ru/user/zmeigorynych3

Сохраняем. Открываем терминал в этой же папке и прописываем:

sudo chmod +x alarm.sh

Вообще, советую запомнить эту команду, поскольку она позволяет, используя терминал присвоить любому файлу любые права доступа ( “+x” означает, что файл отныне будет исполняемым).

В принципе, здесь можно использовать не только интернет-радио, но и запуск музыкальным плеером определенного файла или плей-листа.

Сигнал готов, теперь приступаем к написанию основного скрипта, который будет отвечать за “завод” нашего будильника. Сперва создаем в нашей папке файл wake.sh , в котором записываем следущее:


#! /bin/bash
#Задаем имя первой переменной, отвечающей за дату пробуждения
d=''
#просим ввести эту переменную ( текст внутри кавычек можно изменять по собственному желанию, однако, советую оставить подсказку в скобках, поскольку именно в таком формате необходимо вводить дату, почему объясню чуть ниже)
echo -n "В какой день вас разбудить? (гггг-мм-дд)"
#Просим компьютер считать введенную выше переменную
read d
#вводим следующую переменную,которая будет отвечать за час пробуждения согласно той же схеме
h=''
echo -n "В какой час вас разбудить? (чч)"
read h
# С третьей переменной, отвечающей за минуты пробуждения, будет немного сложнее, поскольку установить одновременно время пробуждения и время срабатывания нашего будильника мы не сможет (не сработает), нам нужно выполнить с ней простое арифметическое действие, поэтому наша следующая переменная должна быть целым числом, а не строкой, как остальные. В этом нам поможет команда declare -i. В остальном, действует точно так же, ка ки с предыдущими переменными.
declare -i m=''
echo -n "Во сколько минут избранного часа вас разбудить? (мм)"
read m
# как я писал выше, просто так взять и назначить время пробуждение и срабатывание будильника на одну и ту же минуту нельзя, поэтому мы укажем компьютеру, что срабатывание будильника должно быть через одну минуту после пробуждения.
declare -i z=0
z=$m+1
#По причине того, что я стремился упростить всю имеющуюся структуру и не усложнять ее лишними конструкциями, в ней имеется один довольно существенный баг: при установке переменной “m”, то есть минутпробуждения на 59, наш будильник не сработает.
#В следующих двух строках выводится отладочная информация, позволяющая еще раз взглянуть на данные, которые мы ввели и еще раз проверить их.
echo "$d $h:$m"
echo "$z"
#даем себе время проверить данные ( в примере 20 секунд)
sleep 20
#теперь преобразовываем  понятный нам формат даты в формат, который поймет rtcwake (помните, я говорил, что важно вводить данные именно так, как указано в шаблоне? Так вот, это именно потому, что следующая утилита по-другому их просто не воспримет)
u=$(date +%s -d "$d $h:$m")
#снова отладочная информация, нужная только для того, чтобы понять, что введенные нами данные распознаны успешно.
echo "$u"
#следующая команда вписываетв ремя пробуждение в cron. ВАЖНО!!! ПОМНИТЕ, ПРЕДАСТАВЛЕННАЯ НИЖЕ КОМАНДА СОСТАВЛЕНА ИМЕННО ТАК, ЧТОБЫ ПОЛНОСТЬЮ ПЕРЕПИСАТЬ СОДЕРЖИМОЕ CRONTAB.Это сделано для того, чтобы в нем не скапливалось огромное количество конфликтующих задач. Однако, если вы используете его для других задач, выполняемых, по расписанию, они будут затерты.
echo "DISPLAY=:0
$m $h * * *  /home/USERNAME/wakeupdude/alarm.sh" |crontab -
# естественно, что /home/USERNAME/wakeupdude/alarm.sh это путь к вашему файлу, в котором записан ваш сигнал.
#Ну и последняя часть - приказ компьютеру на засыпание.
sudo rtcwake -m mem -t $u
#При исполнении команды компьютер затребует пароль администратора, в принципе, это можно отключить через файл sudoers, но я не советую, поскольку дает нам возможность отказаться от выключения компьютера, если обстоятельства изменились.

Теперь сохраняем файл и с помощью команды chmod +x  даем ему права исполняемого. В принципе, наш будильник готов, но, поскольку мы живем в благословенном 2018 году, то каждому уважающему себя приложению нужен ярлык на рабочий стол, то мы его и изготовим:

В нужной папке создадим файл с расширением .desktop, откроем этот файл в редакторе, где и пропишем следующее:

[Desktop Entry]
Name=Будильник
Terminal=true
Icon=/путь/до/картинки/которая/нам/нравится.png
Exec=/путь/до/нашего/скрипта
Type=Application

Закрываем с сохранением и при следующем запуске выбираем “сделать исполняемым”.  Наш будильник готов.

7 комментариев к “Будильник на Bash”

  1. Можно конечно и через cron, но, если не стоит задача получения практики в шелле, имеет смысл взять уже готовый user-friendly будильник -- с простой UI-настройкой и минимумом отьедаемых ресурсов. Я, например, пользуюсь стандартным гномовским AlarmClock https://www.linuxlinks.com/AlarmClock (тихо висит в трее, запускает мелодию или плеер/браузер, позволяет ставить пробудку по дням недели и тд.)

    Ответить
  2. А у меня вот так и не получается запустить, пробовали и браузеры запускать через крон и vlc и я я mplayer, процесс появляется, но окно так и не всплывает, гуглу только намекает, что проблема в переменных, но вот решить задачу не получается, из переменных добавил только DISPLAY=:0, система ubuntu 20.04

    Ответить

Оставьте комментарий