Пишем консольный будильник на BASH

Задача "Проснуться утром" для меня, честно говоря, довольно сложная. Неделю назад пришла в голову идея: написать простой будильник, который будет проигрывать музыку все громче и громче пока не решишь математический пример.

В гугле есть некоторые статьи и темы, но все не то, что нужно.

Сразу оговорюсь, что компьютер (в моём случае ноутбук) ночью находится в спящем режиме, поэтому ему потребуется немного зарядки на ночь (у меня за ночь уходит около 30% батареи).
Если у вас настольный компьютер, есть перебои с электричеством и нет ИБП, то лучше не рискуйте.

Далее вы должны убедиться, что ваш компьютер поддерживает некоторые режимы "сна". Можете почитать об этом здесь.

Что нам потребуется:

  • Утилита rtcwake — для засыпания компьютера (встроена в ядро)
  • Утилита amixer — для постепенного увеличения громкости звука
  • Любой проигрыватель, позволяющий воспроизводить музыку в цикле (в моём случае mplayer)

Начнём

Зададим необходимые переменные:

Здесь всё понятно.

  • "время для смены задачи" — время простоя перед генерацией новой задачи
  • "папка с музыкой" — папка, из которой нужно брать список музыки. Я просто создал папку alarm и создал жёсткие ссылки на необходимые мне музыкальные композиции
  • "временный файл для статуса" — нужен для завершения увеличения громкости. Если существует непустой файл, то завершаем фоновой процесс (кстати, можно просто через "jobs -l" найти наш процесс)

Теперь нужно написать функцию, которая будет убивать процессы mplayer-а и/или заново воспроизводить случайную музыку.

Также нужно перехватывать сигналы завершения процесса.

Для того, чтобы можно было указать время просыпания будем использовать необязательный параметр $1. Сразу сделаем все проверки валидности даты.

Переменные date1 и date2 нужны на случай, если пользователь укажет прошедшую дату, тогда время для просыпания будет установлено завтрашним днём. Если же время будет указано, например "07:99", то в переменную err будет занесён код ошибки.

Теперь можно "заставить" компьютер спать. rtcwake требует прав суперпользователя. Можно воспользоваться sudo. Всё, что вы делаете — вы делаете на свой страх и риск.

Про rtcwake, как уже говорил, вы можете прочитать здесь.

Осталось только сделать повышение громкости и пример для решения.

Строчкой "amixer sset Master 1%+ &> /dev/null" мы указываем, что нужно повышать громкость на 1 процент и не нужно ничего выводить на экран.
Знак амперсанда & после оператора done нужен для того, чтобы увеличение громкости было в фоне.

И генерируем пример:

Вот и всё. Будильник был написан неделю назад. Телефонные будильники были выключены. За эту неделю я вполне мог проснуться пока решаю пример (задачка может быть очень простой (1020 — 120) или сложной (394 * 5). В одно утро мне попадался 13 раз подряд пример с умножением).

Можно создать alias в файле ~/.bashrc:

Для того, чтобы будильник нельзя было выключить закрытием программы консоли, я выхожу из текущего сеанса и переключаюсь в другую консоль (Alt+Ctrl+F1 или другой F[1-7]).
При желании будильник можно отключить подав сигнал принудительного закрытия, но для этого нужно будет зайти в другую консоль, авторизоваться, найти этот процесс и убить. Быстрее, наверно, решить пример.

Для удобства код скопирован на pastebin, чтобы можно было скачать.

Надеюсь этот будильник заставит не проспать на учёбу или работу.

Задача "Проснуться утром" для меня, честно говоря, довольно сложная. Неделю назад пришла в голову идея: написать простой будильник, который будет проигрывать музыку все громче и громче пока не решишь математический пример.

В гугле есть некоторые статьи и темы, но все не то, что нужно.

Сразу оговорюсь, что компьютер (в моём случае ноутбук) ночью находится в спящем режиме, поэтому ему потребуется немного зарядки на ночь (у меня за ночь уходит около 30% батареи).
Если у вас настольный компьютер, есть перебои с электричеством и нет ИБП, то лучше не рискуйте.

Далее вы должны убедиться, что ваш компьютер поддерживает некоторые режимы "сна". Можете почитать об этом здесь.

Что нам потребуется:

  • Утилита rtcwake — для засыпания компьютера (встроена в ядро)
  • Утилита amixer — для постепенного увеличения громкости звука
  • Любой проигрыватель, позволяющий воспроизводить музыку в цикле (в моём случае mplayer)

Начнём

Зададим необходимые переменные:

Здесь всё понятно.

  • "время для смены задачи" — время простоя перед генерацией новой задачи
  • "папка с музыкой" — папка, из которой нужно брать список музыки. Я просто создал папку alarm и создал жёсткие ссылки на необходимые мне музыкальные композиции
  • "временный файл для статуса" — нужен для завершения увеличения громкости. Если существует непустой файл, то завершаем фоновой процесс (кстати, можно просто через "jobs -l" найти наш процесс)

Теперь нужно написать функцию, которая будет убивать процессы mplayer-а и/или заново воспроизводить случайную музыку.

Также нужно перехватывать сигналы завершения процесса.

Для того, чтобы можно было указать время просыпания будем использовать необязательный параметр $1. Сразу сделаем все проверки валидности даты.

Переменные date1 и date2 нужны на случай, если пользователь укажет прошедшую дату, тогда время для просыпания будет установлено завтрашним днём. Если же время будет указано, например "07:99", то в переменную err будет занесён код ошибки.

Теперь можно "заставить" компьютер спать. rtcwake требует прав суперпользователя. Можно воспользоваться sudo. Всё, что вы делаете — вы делаете на свой страх и риск.

Про rtcwake, как уже говорил, вы можете прочитать здесь.

Осталось только сделать повышение громкости и пример для решения.

Строчкой "amixer sset Master 1%+ &> /dev/null" мы указываем, что нужно повышать громкость на 1 процент и не нужно ничего выводить на экран.
Знак амперсанда & после оператора done нужен для того, чтобы увеличение громкости было в фоне.

И генерируем пример:

Вот и всё. Будильник был написан неделю назад. Телефонные будильники были выключены. За эту неделю я вполне мог проснуться пока решаю пример (задачка может быть очень простой (1020 — 120) или сложной (394 * 5). В одно утро мне попадался 13 раз подряд пример с умножением).

Можно создать alias в файле ~/.bashrc:

Для того, чтобы будильник нельзя было выключить закрытием программы консоли, я выхожу из текущего сеанса и переключаюсь в другую консоль (Alt+Ctrl+F1 или другой F[1-7]).
При желании будильник можно отключить подав сигнал принудительного закрытия, но для этого нужно будет зайти в другую консоль, авторизоваться, найти этот процесс и убить. Быстрее, наверно, решить пример.

Для удобства код скопирован на pastebin, чтобы можно было скачать.

Надеюсь этот будильник заставит не проспать на учёбу или работу.

Купили себе новый телефон, но не знаете как раскрыть его потенциал? Тогда вам просто нужно скачать приложения и игры для телефона. Для этого вам стоит зайти на этот сайт и скачать всё то, что сами пожелаете.