Запустить Rhythmbox из cron.

Вопрос или проблема

Возможно ли запустить Rhythmbox с помощью cron и заставить его воспроизводить музыку?

Моя конечная цель — автоматически запускать разные плейлисты в разное (фиксированное) время, но я подумал разбить проблему на более простые этапы, и здесь я спрашиваю, как просто запустить программу.

Я прочитал несколько страниц, обсуждающих эту проблему, например, здесь и здесь. Судя по разным источникам, проблема довольно “зависима от системы”.

Я пробовал на ноутбуке с Linux Mint 22 Wilma и на Raspberry с версией Linux 6.6.62-rpt-rpi-v8.

Мой crontab выглядит следующим образом:

XAUTHORITY=~/.Xauthority
DISPLAY=:0.0
* *  *  *  *  rhythmbox

Я замечаю, что в назначенное время (в данном случае каждую минуту, в диагностических целях) в системном журнале я вижу это:

2025-01-22T15:49:01.990579+05:00 HP-probook CRON[239988]: (root) CMD (rhythmbox)
2025-01-22T15:49:02.019431+05:00 HP-probook CRON[239987]: (CRON) info (No MTA installed, discarding output)

и если я добавлю код: >/dev/null 2>&1 | logger -t mycmd в конец команды cron (как это предлагается здесь), я также получаю следующие записи в журнале:

2025-01-22T15:49:01.366208+05:00 HP-probook CRON[241108]: pam_unix(cron:session): session opened for user root(uid=0) by root(uid=0)
2025-01-22T15:49:01.366644+05:00 HP-probook CRON[241107]: pam_unix(cron:session): session opened for user root(uid=0) by root(uid=0)

Я также пытался записать команду в скрипт оболочки и затем запускать этот скрипт из cron, но тоже безрезультатно.

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

Заранее благодарю за любую помощь или идеи!

P.S.
Этот вопрос, предложенный как подобный, обсуждает, запускает ли приложение пользователь или root, и задаёт вопрос в целом, об любом приложении. Мой вопрос специфичен для Rhythmbox, и в моём случае я был бы рад найти решение, специфичное для этого приложения, например, запустить его без GUI.

P.P.S.
Мне нужен именно Rhythmbox, потому что это единственный, насколько я знаю, который может отправлять информацию о мета-тегах в BUTT (инструмент потоковой передачи)

вы можете использовать таймер systemd –user для этого вместо cron, как объяснено здесь:
https://gist.github.com/oprypin/0f0c3479ab53e00988b52919e5d7c144

файлы должны выглядеть примерно так:

rhythmbox1.service

[Unit]
Description=rhythmbox playlist 1 starter

[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=rhythmbox...playlist1

[Install]
WantedBy=default.target

rhythmbox1.timer

 [Unit]
 Description=rhythmbox playlist 1 timer

 [Timer]
 OnCalendar=*-*-* 16:30:00

 [Install]
 WantedBy=timers.target

Ответ или решение

Запуск приложения Rhythmbox с использованием cron может представлять собой сложную задачу, особенно в связи с его графическим интерфейсом, который требует определенных условий для корректного выполнения. В то же время, использование cron для запуска графических приложений на рабочем столе Linux — задача нетривиальная, так как cron обычно выполняется в среде без X-сессии. Ниже мы разберем, как можно попытаться решить эту задачу, и продемонстрируем альтернативу, которая может быть более подходящей для ваших нужд.

Теория

Cron — это инструмент для планирования выполнения повторяющихся команд и скриптов в системе на основе Unix. Однако, cron предназначен для выполнения задач в фоновом режиме и не управляет графическими сессиями, необходимыми для приложений с интерфейсом пользователя. Поскольку Rhythmbox является графическим приложением, его запуск из cron может требовать дополнительных настроек, таких как использование переменных окружения DISPLAY и XAUTHORITY для указания графической сессии, под которой должно работать приложение.

Пример

Исходя из вашего примера, вы настраивали cron с использованием следующих переменных окружения:

XAUTHORITY=~/.Xauthority
DISPLAY=:0.0
* * * * * rhythmbox

Тем не менее, даже несмотря на эти настройки, возникают сложности с запуском Rhythmbox через cron. Это связано с тем, что cron работает вне контекста текущей пользовательской сессии рабочего стола и, по сути, не имеет доступа к графическому интерфейсу.

При возникновении такой ошибки cron может регистрировать сообщение о том, что "нет MTA" (Mail Transfer Agent), описывающее отсутствие возможности отправки почты с результатами выполнения команд cron. Это может быть решено путем перенаправления вывода на /dev/null или использование logger для логирования ошибки, но это касается только вывода сообщений и не решает основную проблему запуска GUI-приложения через cron.

Применение

Чтобы обойти эти трудности и успешно автоматизировать запуск Rhythmbox с cron, вы можете попробовать следующие шаги:

  1. Убедитесь, что у вас есть необходимые права для запуска Rhythmbox в X-сессии и доступ к окружению DISPLAY пользователя, с которым планируется выполнение.

  2. Рассмотрите возможность использования at для более гибкого управления заданиями, которые требуют окружения пользователя.

  3. Однако, более реалистичным подходом будет использование systemd — это современная система инициализации, обладающая механикой юнитов и таймеров, что позволяет задать процессы точнее и удобнее, чем cron.

Альтернативный подход через systemd

Вот пример того, как можно использовать systemd для вашей задачи, что может быть предпочтительным методом для запуска таких приложений:

1. Файл Юнита для Rhythmbox (rhythmbox1.service)

Создайте файл юнита для systemd с использованием следующей конфигурации:

[Unit]
Description=rhythmbox playlist 1 starter

[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=rhythmbox-client --play-uri=PATH_TO_YOUR_PLAYLIST

[Install]
WantedBy=default.target

Здесь PATH_TO_YOUR_PLAYLIST замените на путь вашего плейлиста, чтобы указать Rhythmbox, что именно воспроизводить.

2. Таймер для Rhythmbox (rhythmbox1.timer)

Теперь создайте связанный с сервисом таймер:

[Unit]
Description=rhythmbox playlist 1 timer

[Timer]
OnCalendar=*-*-* 16:30:00

[Install]
WantedBy=timers.target

Этот таймер будет запускать сервис в указанные моменты времени (например, ежедневный запуск в 16:30).

Реализация

Сохраните файлы сервиса и таймера в директории ~/.config/systemd/user/ (если вы хотите, чтобы задачи выполнялись от имени текущего пользователя, а не от имени системы) или /etc/systemd/system/ (если задачи будут системными). После этого выполните следующие команды для запуска и активации таймера:

systemctl --user daemon-reload
systemctl --user start rhythmbox1.timer
systemctl --user enable rhythmbox1.timer

Эти шаги позволят systemd управлять запуском Rhythmbox в определенные моменты времени в соответствии с расписанием, заданным вами.

Подводя итог

Хотя cron технически может исполнять команды на ассемблере, для запуска GUI-приложений в большинстве сценариев он не является лучший выбор. Systemd предоставляет более надежную и безопасную систему, предложенную для выполнения подобных задач, включая автоматизацию работы с приложениями с графическим интерфейсом.

Таким образом, используя systemd и его возможности для запуска таймеров, вы можете не только запускать Rhythmbox в нужное время, но и управлять процессом эффективнее и безопаснее. Вопрос о сложности применения cron для GUI приложений мы подробно разобрали, и надеемся на полезность предложенной альтернативы с использованием systemd.

Оцените материал
Добавить комментарий

Капча загружается...