Сегодня покажу, как создавать кастомные функциональные уведомления на рабочем столе с помощью консольной утилиты notify-send
. Такие уведомления поддерживают активные кнопки, умеют отображать иконки и кликабельные веб ссылки. В качестве примера настроим напоминалку с помощью скриптика на Bash и планировщика Cron для запуска уведомлений по расписанию. Будет интересно)
🖐️Эй!
Подписывайтесь на наш телеграм @r4ven_me📱, чтобы не пропустить новые публикации на сайте😉. А если есть вопросы или желание пообщаться по тематике — заглядывайте в Вороний чат @r4ven_me_chat🧐.
Предварительные требования
Для реализации нашей задачи необходима утилита notify-send
версии 0.8+, т.к. начиная с этой версии она поддерживает активные кнопки. Проверить версию можно такой командой:
notify-send --version
Версия nptify-send
Данная утилита является частью пакета libnotify-bin
, который зависит от библиотеки уведомлений — libnotify4
. Соответственно версия у этих пакетов также должна быть 0.8 или выше.
Проверить версию этих пакетов можно такой командой:
apt show libnotify4 libnotify-bin | grep Version
Команда
apt show
показывает подробную информацию о пакете.
Версия библиотек
Если версия пакетов libnotify-bin
и libnotify4
в вашей системе меньше 0.8 (а в Linux Mint 21.3 и Ubuntu 22.04.03 как раз версия 0.7.9):
то их необходимо обновить вручную. Инструкция, как это сделать на примере Linux Mint под спойлером.
Примечательно, что в Linux Mint, основанной на Debian 12 (LMDE), версия
libnotify4
в стандартных репозиториях находится версия 0.8.1.
В репозиториях промежуточного дистрибутива Ubuntu версии 23.10 есть совместимые пакеты нужной версии. Идём на страницу загрузки, скачиваем и устанавливаем.
Кликните, для просмотра инструкции по обновлению пакетов libnotify4
и libnotify-bin
до версии 0.8.2 в Linux Mint 21.
Качаем пакет libnotify4
: https://packages.ubuntu.com/ru/mantic/amd64/libnotify4/download
При попытке установки, система уведомит нас, что из репозиториев уже установлена более старая версия:
Установка libnotify4
Нажимаем закрыть и далее «Установить пакет»:
Установка libnotify4
Теперь качаем libnotify-bin
на странице: https://packages.ubuntu.com/ru/mantic/amd64/libnotify-bin/download
Установка аналогичная:
Установка libnotify-bin
Если всё встало корректно, проверяем версию:
apt show libnotify4 libnotify-bin | grep Version
notify-send --version
Проверка версий пакетов
Отлично. Теперь можем приступать к настройке кастомных уведомлений.
Пример вывода сообщений с помощью команды notify-send
Синтаксис команды notify-send
имеет следующий вид:
notify-send [параметры] <заголовок_уведомлений> [тело_сообщения]
Помните, что в квадратных скобках указаны необязательные параметры)
Пробуем отправить простое текстовое уведомление:
notify-send 'Тестовое сообщение' 'Hello R4ven'
Тестовое уведомление
С помощью параметра --action
можно создать кнопку, одну или несколько, при нажатии которой процессу возвращается ответ в стандартный вывод stdout. Такой подход позволяет гибко обрабатывать действия на нажатие кнопок уведомлений в скриптах и командах. Пример реализации будет ниже.
Про стандартные потоки данных в Linux я рассказывал в отдельной статье: Командная строка Linux, вывод и чтение содержимого: команды echo, cat, less.
Давайте попробуем вывести уведомление с активной кнопкой:
notify-send 'Тестовое сообщение' 'Hello R4ven' --action 'pressed=Тык на кнопку'
Уведомление с активной кнопкой
В команде выше мы для параметра --action
указали ключ pressed
, который необходимо возвратить оболочке при нажатии на кнопку. Т.е. при нажатии на кнопку, в консоли будет выведено слово pressed
. Если такой ключ не задать, то по умолчанию возвращается нулевой код завершения.
Теперь попробуем вывести уведомление с несколькими кнопками:
notify-send 'Тестовое сообщение' 'Hello R4ven' --action 'pressed=Тык на кнопку' --action 'pressed=Не нажимай на меня'
Уведомление с несколькими кнопками
Ключи для кнопок можно задавать произвольные.
Выведем уведомление с системными иконками, добавив параметр -i
и название иконки:
notify-send -i 'face-devilish' 'Тестовое сообщение' 'Hello R4ven' --action 'pressed=Тык на кнопку'
Где face-devilish
— название иконки.
Уведомление с иконкой
Чтобы узнать названия иконок в системе, можно воспользоваться графической утилитой gtk3-icon-browser
. Она идёт в составе пакета gtk-3-examples
из стандартных репозиториев. Для его установки выполните:
sudo apt install gtk-3-examples
После установки выполните в консоли:
gtk3-icon-browser
Просмотр иконок в gtk3-icon-browser
Ну и пример уведомление с кликабельной веб ссылкой:
notify-send -i 'face-devilish' 'Тестовое сообщение' 'https://r4ven.me - вороний блог' --action 'pressed=Тык на кнопку'
Уведомление с веб ссылкой
Теперь давайте настроим напоминалку в виде уведомления, в котором будет сообщение, что нужно отлипнуть от экрана монитора и выполнить гимнастику для глаз по видео на YouTube.
Пишем bash скрипт для удобства
Открываем новый файл на редактирование:
nvim ~/.local/bin/notify.sh
И наполняем его таким кодом:
#!/usr/bin/env bash
# задаём переменные
notify_title="Выполни гимнастику для глаз"
notify_messasges="Смотри видео 1 или 2"
notify_icon="face-devilish"
notify_button1="Видео на 1 мин."
notify_button2="Видео на 5 мин."
pressed_button="$(notify-send "$notify_title" "$notify_messasges" -i "$notify_icon" --action "video1=$notify_button1" --action "video2=$notify_button2")"
# составляем условное выражение для обработки нажатий на кнопки
if [[ "$pressed_button" == "video1" ]]; then
firefox --new-window https://youtu.be/4ZHVYQX7tx0
elif [[ "$pressed_button" == "video2" ]]; then
firefox --new-window https://youtu.be/SAU-Smg3tfg
fi
Скрипт на bash
Скрипт также доступен в репе на GitHub.
В данном скриптике мы сначала определяем переменные, содержимое которых мы будем выводить в уведомлении. Затем задаём отдельную переменную, которая, с помощью механизма подстановки будет содержать результат выполнения команды с notify-send
. После чего, с помощью условных выражений обрабатываем полученный вывод. В данном примере — открывается новое окно firefox с выбранной, в зависимости от нажатой кнопки, ссылкой на видео с упражнениями для глаз. Видео я взял из тырнета.
Если вы настраивали Neovim по , то помните, что при нажатии F5
происходит сохранение файла и, если он является скриптом, то его выполнение во всплывающем окне редактора:
Проверка работы скрипта
Для выхода либо нажмите на уведомление, либо Ctrl+c
в окне редактора. Как видно, скрипт исполняется)
Если Neovim вы не настраивали, то просто сохраняем файл и выходим. Затем делаем наш скрипт исполняемым такой командой:
chmod +x ~/.local/bin/notify.sh
chmod
— это команда управления правами на файлы в Linux, а+x
это параметр добавления флага исполнения для указанного файла. В скором будущем будет отдельный пост по , как раз поговорим про права.
Проверим результат команды выше:
ls -l ~/.local/bin/notify.sh
Просмотр инфо о скрипте
Отлично. Теперь, чтобы выполнить скрипт, просто указываем путь до него в терминале. При наличии флага исполнения (x
), командная оболочка сама поймёт, чтобы вы запускаете исполняемый файл. Вводим в терминале:
~/.local/bin/notify.sh
Запуск скрипта
Все работает. Теперь давайте создадим задание, которое будет запускать данный скрипт каждые 3 часа.
Добавляем задание в планировщик Cron
В системах на базе Linux из коробки поставляется стандартный планировщик заданий — Cron. Он довольно прост в использовании, стоит только разобраться в синтаксисе расписаний выполнения.
Чтобы задать расписание в Cron для текущего пользователя вводим в терминале такую команду:
crontab -e
Если вы выполняете эту команду впервые, вам предложат выбрать консольный текстовый редактор, для редактирования заданий cron. Разумеется мы выбираем Neovim)
В моём случае выбираю 2-й пункт и нажимаю Enter:
Выбор редактора
По умолчанию, файл crontab уже хорошо прокомментирован: объясняется синтаксис и приведен пример задачи.
Окно планировщика cron
Первые 5 параметров, разделенные пробелом, являются значениями расписания:
- 1 — минуты;
- 2 — часы;
- 3 — день месяца;
- 4 — месяц;
- 5 — день недели.
Значения по умолчанию — это символы * * * * *
, которые обозначают «каждый раз», т.е. каждую минуту, каждый час ну и т.д.
Более подробное описание + возможность протестировать синтаксис можно на полезном ресурсе: https://crontab.guru (EN).
После открытия crontab, добавляем в конец файла такую строку:
*/2 * * * * DISPLAY=":0.0" XDG_RUNTIME_DIR="/run/user/$(id -u)" ~/.local/bin/notify.sh
Состав строки:
*/2
— раз в 2 минуты (установим для проверки);*
— каждый час;*
— каждый день;*
— каждый месяц;*
— каждого дня недели;DISPLAY=":0.0"
— переменная окружения, задающая номер дисплея графического сеанса;XDG_RUNTIME_DIR="/run/user/$(id -u)"
— переменная окружения, определяющая директорию исполнения;~/.local/bin/notify.sh
— путь до скрипта, тут может быть любая другая команда.
Переменные DISPLAY
и XDG_RUNTIME_DIR
необходимы, чтобы cron понимал, в какой среде необходимо выводить уведомления. Если их не указать, то скрипт будет выполниться, но в фоновом режиме и уведомлений мы не увидим.
Сохраняем и закрываем редактор.
Теперь, каждые 2 минуты на рабочем столе должно появляться наше настроенное уведомление:
Проверка cron
Чтобы посмотреть список установленных задач в crontab выполните команду:
crontab -l
Вывод задач планировщика
После того как убедимся, что запланированное задание работает, отредактируем время его появления — установим на каждые 3 часа. Для этого скорректируйте строку задачи (в 0 минут каждого 3-го часа):
0 */3 * * * DISPLAY=":0.0" XDG_RUNTIME_DIR="/run/user/$(id -u)" ~/.local/bin/notify.sh
Заключение
Вот мы с вами немного узнали про уведомления на рабочем столе Linux: научились отправлять их в ручную из терминала с помощью команды notify-send
, написали небольшой Bash скрипт для удобства и добавили его запуск в системный планировщик заданий — Cron.
В будущем обязательно сделаю отдельную статью про детальную настройку планировщика Cron и его возможности. А пока, спасибо, что читаете) Подписывайтесь на наш телеграм канал @r4ven_me и добавляйтесь в чат @r4ven_me_chat, если у вас появились вопросы или просто желание обсудить интересные темы из мира IT.
Успехов!