LINUX.ORG.RU

Утилита rmd — от костыля sleep && notify-send к CLI-напоминалке для Linux

 , , , ,


1

2

Раньше я делал так:

(sleep 25m && notify-send "Пора выпить кофе") &

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

Мне были нужны одноразовые напоминания, которые:

  • не пропадают после перезагрузки и спящего режима;
  • гарантированно привлекают внимание (через уведомления рабочего стола);
  • не тянут за собой канбан, проекты и «когда-нибудь».

Так появилась rmd — лёгкая CLI-утилита с фоновым демоном для Linux.

Интерфейс

Примеры вызова:

rmd +25m Пора выпить кофе
rmd tomorrow 15:00 Созвон по релизу
rmd fri 22:00 Заткнись и иди спать!
rmd 2026-12-01 10:00 Продление домена
rmd

Без аргументов rmd выводит список ближайших активных напоминаний. Поддерживаются относительные интервалы, дни недели и точные даты. Подробнее о синтаксисе времени можно почитать в документации.

Пример списка уведомлений

Просто напоминалка

Это не менеджер задач. Нет повторяющихся проектов, досок, списков «прочитать потом». Уведомления задуманы только для событий с дедлайном по времени: еда на плите, созвон через 10 минут, «выйти из дома».

Если нужен todo с проектами — это другой класс инструментов. У rmd намеренно более узкая специализация.

От sleep && notify-send отличается наличием:

  • фонового демона: systemd user service или автозапуск из CLI;
  • сохранения состояния: ~/.local/state/rmd/reminders.json — напоминания остаются после перезагрузки;
  • обработки пропущенных срабатываений: если машина была выключена, приходит одно сгруппированное уведомление.

Стек: Linux + notification daemon. Написано на Rust, без тяжёлого runtime вокруг одной утилиты.

Внутреннее устройство

CLI общается с демоном по Unix-сокету. Демон держит таймеры в памяти и атомарно пишет JSON на диск. В момент срабатывания уходит уведомление по D-Bus. При старте демон проверяет, не было ли пропусков, пока система была выключена.

Требования:

  • Linux (x86_64 или aarch64)
  • Демон уведомлений по D-Bus

macOS и Windows не поддерживаются.

Установка:

  • Исходники и описание: github/rmd
  • Бинарники: github/releases
  • Из crates.io: cargo install rmd-cli (бинарь называется rmd)

Альтернативы

Инструменты вроде at, cron, systemd timers и полноценных todo-менеджеров решают смежные задачи. Мне не хватало инструмента под узкий сценарий: ввёл время и текст в одной строке — получил гарантированное уведомление, которое не пропадёт после перезагрузки. Без аккаунта в облаке и без ежедневного ритуала «разобрать входящие».

Если вы тоже устали от sleep && notify-send и не хотите ради чайника заводить пятый таск-трекер — имеет смысл попробовать.

>>> Репозиторий на GitHub



Проверено: dataman ()
Последнее исправление: dataman (всего исправлений: 5)

а чего пакеты под все архитектуры не собираешь? настрой автоматику

может кому-то будет полезно

unclestephen ★★★★★
()
Ответ на: комментарий от unclestephen

Сейчас в релизах собираются x86_64-unknown-linux-musl и aarch64-unknown-linux-musl – этого хватает на типичный десктоп/ноут и часть ARM-плат.

Остальные таргеты (armv7, riscv64 и т.д.) и пакеты под дистрибутивы пока не делал: для первой версии ограничил CI тем, чем сам пользуюсь. Автосборку через GitHub Actions на теги уже завязал; расширить матрицу архитектур – разумный следующий шаг, если будет спрос или PR.

bunch
() автор топика
Ответ на: комментарий от unclestephen

А какие еще есть живые архитектуры, кроме этих двух?)

RISC-V всё еще экзотика, 32-битное всё сдохло.

wandrien ★★★★
()

Написано на Rust

Нужно в теги, как и «от автора». На них и подписываются, и отписываются.

dataman ★★★★★
()
Ответ на: комментарий от dataman

Сделано: добавил «rust» и «от автора».

bunch
() автор топика

Раньше я делал так:

А потом появилась нейросеть и дала кнопку «Сделать хорошо».

steemandlinux ★★★★★
()

Мне были нужны одноразовые напоминания, которые

вот почему нельзя честно написать «захотелось повайбкодить»? Вайбкодеры вечно выдумывают какие-то отговорки. Есть крон и сустемд таймеры, есть всякие zsh calendar, в конце концов можно просто открыть алису на смартфоне и голосом поставить там таймер. Но нет, мы получаем очередное ненужно на расте.

Lrrr ★★★★★
()
Ответ на: комментарий от argv_0_

во !! онное самое. долго вспоминал сию команду… :)

pfg ★★★★★
()

Недавно тоже захотелось чего-то подобного.

Нашёл для себя KAlarm. То, что нужно - ко времени делает напоминалки, сами напоминалки вылезают отдельным окном. Красота!

bbc69
()

А я просто будильник завожу в телефоне

Manhunt ★★★★★
()
Ответ на: комментарий от bbc69

да, если нужен GUI в KDE – хороший вариант; rmd – про CLI и минимальный scope

bunch
() автор топика
Ответ на: комментарий от argv_0_

Вот спросишь на форуме как сделать какую-то небольшую задачу - и никто не ответит внятно. Напишешь свой велосипед - и тебе скажут «так это было сделано ещё в 7-й редакции Unix (V7), выпущенной в 1979 году!» :)

PeleWin
()
Ответ на: комментарий от PeleWin

:) Жиза. Я для этого ИИшку мучал. Не с первого раза, но нашёл.

bbc69
()
Ответ на: комментарий от anonymous_sama

Я просто Алису для такого использую

Ты кавычки забыл. Потому как Алису по другому надо использовать :)

DrRulez ★★★★★
()

systemd-run --on-active=25min --unit=coffee-reminder notify-send "Помни!" "Кофейку бахни"

Писать целый демон для тривиально решаемой встроенными инструментами задачи это какой-то новый уровень велосипедостроения. Что уход в сон, что перезагрузку отлично переживёт разумеется. Никакие облака не нужны - только мозг.

zabbal ★★★☆☆
()
Последнее исправление: zabbal (всего исправлений: 1)
Ответ на: комментарий от bunch

То есть вместо 10-20 строк на любом скриптовом языке, которые будут брать командную строку и кормить at соответствующим набором команд — цельный проект на расте со своим отдельным деймоном?
Этот мир уже не спасти...

argv_0_ ★★
()
Ответ на: комментарий от zabbal

Пердолиться с консолью, когда есть специализированная прога - это какой-то новый уровень красноглазия.

Нормальная прога. Есть аналоги, но их хрен найдёшь сходу.

bbc69
()
~% echo 'notify-send -u critical "Здравствуй, lor, я хочу показать тебе интересную команду." "man at"' | at now + 1 minute
ugoday ★★★★★
()
Ответ на: комментарий от bbc69

Пердолиться с консолью, когда есть специализированная прога - это какой-то новый уровень красноглазия.

Тоже не понял на кой хрен автору именно консоль сдалась.

zabbal ★★★☆☆
()

фонового демона: systemd user service или автозапуск из CLI;

можно чуть подробнее?
полная привязка к systemd или ...?
что есть «автозапуск из CLI»?

sunjob ★★★★★
()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от DrRulez

с «той» алисой, обычно, все наоборот - она «тебя» использует! :о)

sunjob ★★★★★
()
Ответ на: комментарий от bbc69

в KDE5/6 нормально работает, не глючит/не падает?
(в TDE/Trinity сколько не пробовал - «странно» ведет себя, падает от полчиха, короче не варинат. разбираться не стал)

sunjob ★★★★★
()
Ответ на: комментарий от sunjob

Я её не так сильно мучаю, чтобы прямо отловить что-то. Но «на моем машине работает нормально».

Единственное, хотел сообщения через кедовкие оповещения засылать, так не понравилось потому, что те скрывались по таймауту, а мне надо чтобы висело, пока не ткнул. В итоге оставил встроенные всплывающие окна.

Ни разу не падало, но я не особо представляю, что там упасть может.

У меня plasmashell 6.7.4 если что.

bbc69
()

rmd

На мой взгляд не стоит так называть утилиты. Оставьте трехсимвольное для псевдонимов, пользователь может нарваться на приоритеты команд, у alias он выше, чем у исполняемого файла.

dmitry237 ★★★★★
()
Ответ на: комментарий от sunjob

Жёсткой привязки к systemd нет. Юзер-юнит нужен для удобства, чтобы демон поднимался при логине после ребута. Если systemd нет или юнит выключен, любая команда rmd сама поднимает демон в фоне – это и есть «автозапуск из CLI». Минус такого подхода – после ребута напоминаний не будет, пока вы не сделаете первый вызов rmd.

bunch
() автор топика
Ответ на: комментарий от dmitry237

Да, с личным alias возможен конфликт. Короткое имя выбрано намеренно – ради быстрого набора. Если alias rmd уже занят, оболочка действительно возьмёт его. В таком случае бинарь можно вызвать в обход алиаса как \rmd, по полному пути или переименовать при установке.

bunch
() автор топика
Ответ на: комментарий от bunch

Мне с самого утра это название тоже покоя не давало.
Дело не только в alias’е, хотя и об этом я тоже задумался.

Расхождение названия утилиты и её назначения спровоцировало лёгкий диссонанс.
Ожидается расшифровка типа: ReMove Directory, ReMove Daemon, ReMove Disk, ReMove Driver, ReMove Data, ReMove Drudgeons и разное другое, но всё связано с удалением чего-то.
Жутко не хватает буквы n, которая и придала бы смысл и устранила тревожные, удалятельные фантазии. :-)

Больше подошли бы имена rmnd, rmndr или их вариации.
IMHO, разумеется.

P.S. На GitHub куча программ с таким именем, но и rmd тоже есть. Вряд ли совпадающее название стало бы проблемой.

k6
()
Ответ на: комментарий от k6

rmndr

Осталось выяснить куда девать время, сэкономленное на вводе гласных букв. Ну или писать уж справа-налево, раз мы тут без огласовок решили писать rdnmr и точка. По крайней мере никаких ассоциаций с удалением чего бы то ни было.

ugoday ★★★★★
()
Ответ на: комментарий от k6

Приятно, что вы думали об этом с самого утра :)

На этапе выбора действительно была дилемма между rmnd и rmd. В итоге взял более короткий вариант. Ассоциация с remove, судя по треду, действительно сильная. Видимо, для ассоциации ReMind Daemon и уникальности названия нужно было брать rmdd или rmndd )

bunch
() автор топика
Ответ на: комментарий от ugoday

время, сэкономленное на вводе гласных букв

Ну, я не время экономил, это уж точно. :-)

Не знаю историю предмета, но в UNIX-подобных ОС многие команды оболочки, мелкие CLI-утилитки и т.п. называются/пишутся похожим образом: строчными буквами, с отброшенными гласными и сильно урезанными согласными. Alias’ы те же.

Никакого особенного трепета перед этим «стилем» я не испытываю, но использую.
Например, при создании файлов/директорий.
Аргументируя для себя тем, что короткое имя быстрее набирать, а отсутствие заглавных букв избавляет от необходимости нажимать Shift.
Да и просто привычка. ¯\_(ツ)_/¯

k6
()
Ответ на: комментарий от bunch

набираем в консоли:

$ rmnd

жмем табуляцию:
$ rmnd_dmn

большая кнопка... профит :о)
плюс можно накидать баш-скриптов с «кастомной» настройкой
$ rmnd_dmn_aaa
$ rmnd_dmn_bbb
$ rmnd_dmn_ccc

sunjob ★★★★★
()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от bunch

Ассоциация с remove, судя по треду, действительно сильная.

Я думал, что половина комментариев будет именно об этом. :-)
Частично поэтому ничего и не написал сразу; решил, что и без меня желающие найдутся.

нужно было брать… …rmndd

Вот, мне кажется, самое то. Хоть и длинновато…

k6
()
Ответ на: комментарий от bunch

... я уже не говорю про набор баш-скриптов с «кастомной» настройкой

sunjob ★★★★★
()
Ответ на: комментарий от k6

В 70-х вообще знатно на буквах экономили. Может тогда это тоже была привычка, оставшаяся от прежних поколений, которые программировали паяльником, тумблерами и перфокартами.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

по этому поводу есть старая-добрая «былина» про «ахренительно понятные и удобочитаемые индентификаторы» (надеюсь вы с ней знакомы?! :о)

sunjob ★★★★★
()
Ответ на: комментарий от ugoday

creat
Брр… нет, такую экономию на буквах одобрить никак не могу, нет…
Смысл теряется, звучит странно. Нет пути! :-D

k6
()
Ответ на: комментарий от ugoday

рассказана или прочитана она была в 90х, поэтому за точность и кал-лиграфиЮ не ручаюсь
экзамен по информатики, профессор смотрит ответ студента:

#include <iostrea.h>
...
int i,j;
for(i)
for(j)
...

и говорит студенту:
нет, так писать нельзя! за что отвечает переменная i, за что j?! ни чего не понятно! переменные и инедтификаторы должны быть «ахренительно понятные и удобочитаемые! перепишите задание!

студен переписывает, приносит на проверку:
#include <iostrea.h>
...
int 
awesomely_clear_and_readable_identifier_counter_of_cows_mentally_moving_from_west_to_east_across_the_desert,
another_clear_and_readable_identifier_counter_of_air_in_the_lungs_of_one_ram_walking_next_to_a_camp_of_cows_from_the_west_to_the_east_across_the_desert;
...

sunjob ★★★★★
()
Ответ на: комментарий от k6

Больше подошли бы имена rmnd, rmndr или их вариации.

IMHO, разумеется.

При таких названиях проще уже гласные добавить.

Вообще, я за полноценные названия. Во-первых, не понимаю проблем с вводом команд на линуксе, когда есть двойной таб. Во-вторых, Алиасы лучше на компе настраивать. А в мир - то, что не пересечëтся.

К слову, автодополнение было бы полезнее короткого названия.

bbc69
()
Ответ на: комментарий от bbc69

Вообще, я за полноценные названия.

Ничего против не имею.
Хоть, и в таком варианте есть своя логика: для GUI-программ — полноценные грамотные названия (Firefox); для TUI-программ и CLI-программ — компромиссный вариант покороче (cmus); для alias’ов — самые короткие комбинации, даже короче команд оболочки (l).

У меня вроде довольно логично это (alias’ы) устроено: самые часто используемые — односимвольные, реже используемые — двухсимвольные, ещё реже — трёхсимвольные.

не понимаю проблем с вводом команд на линуксе

У меня с этим нет проблем (кроме как их вспомнить). :-)
Меня всего лишь зацепило отсутствие, казалось бы очевидной в данном случае, буковки n. rmd vs. rmnd.

k6
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.