Вопрос или проблема
Я хотел создать “радиостанцию-будильник” из старого ноутбука. Первый шаг заключался в том, чтобы заставить его воспроизводить аудио в определенное время, поэтому я создал этот скрипт:
#!/bin/bash
echo "идеи для практики"
PATH=/home/rick/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
mpg123 -v /home/rick/Music/mala.mp3
А затем добавил его в свой crontab:
* * * * * ./musicCron.sh 2>> ~/cron.log
Однако я постоянно получаю ошибку:
./musicCron.sh: строка 6: 9803 Ошибка сегментации (сформирован дамп памяти) mpg123 -v ~/Music/mala.mp3
я также пробовал с ffplay, так что думаю, что проблема не в этом.
Есть ли какая-либо причина, по которой я не могу выполнить mpg123 через crontab?
У вас есть другой способ сделать то, что я хочу?
Мне не нужно делать это с cron.
Есть ли другой способ?
У меня была такая же проблема с mpg123
. Я подумал, что это должно быть что-то в среде
, но не смог выяснить что. Это одна из тех проблем, о которых ты думаешь, отложишь в сторонку, и затем ответ приходит сам собой. В любом случае – это сработало для меня; если у вас все еще есть эта проблема, думаю, это может сработать и для вас:
Он использует опцию -l, --login
команды su
, чтобы импортировать полную(по сути) среду любого пользователя. Это можно сделать без обращения к требованию аутентификации, которое обычно сопровождает su – если это выполняется из root crontab
.
Сначала откройте root crontab
для редактирования:
$ sudo crontab -e
Затем добавьте одну строку:
0 7 * * * su rick --login --command=/home/rick/musicCron.sh >> /home/rick/musicCron.log 2>&1
Чтобы объяснить это:
0 7 * * *
запускает скрипт в 07:00su
это ‘заменить пользователя’; говорит оболочке cron “стать” пользователем rick; см.man su
--login
это опция дляsu
– опять же, см.man su
--command=
это другая опцияsu
; “выполнить скрипт …musicCron.sh”>>
перенаправление без перезаписи/home/rick/musicCron.log
объект файла журналов для перенаправления2>&1
перенаправлениеstderr
вstdout
(объединить)
Моя версия вашего скрипта (musicCron.sh
) немного отличается, так как я подключаюсь к Bluetooth-колонке, и хочу, чтобы mpg123
воспроизводил непрерывно. Вот что я использовал:
#!/usr/bin/bash
sleep 5
if [ "$(/usr/bin/bluetoothctl devices Connected)" != "Устройство DF:45:E9:00:BE:8B OontZ Angle solo DS E8B" ]; then
/usr/bin/bluetoothctl connect DF:45:E9:00:BE:8B
fi
/usr/bin/mpg123 --loop -1 /home/pi/rainstorm.mp3
Я использовал bluetoothctl
и “жестко закодировал” конкретную Bluetooth-колонку для подключения. Я использую это, чтобы воспроизводить некоторый фоновый шум, чтобы помочь мне заснуть.
Надеюсь, это поможет.
Ответ или решение
Запуск аудио через crontab может вызвать ряд проблем, которые связаны с особенностями окружения, в котором выполняются задачи cron. Ваша цель создании "радио-будильника" с помощью скрипта, который должен воспроизводить аудиофайл, вполне достижима, однако стоит учесть несколько важных моментов, которые могут препятствовать успешному воспроизведению.
Причины возможных проблем
-
Ограниченное окружение: Задачи, запускаемые через crontab, обычно выполняются в минимальном окружении по сравнению с вашей обычной сессией пользователя. Это может означать, что такие переменные, как
DISPLAY
и другие настройки среды, не будут установлены, что уменьшит возможность воспроизведения аудио. -
Отсутствие доступа к звуковой карте: Система может не позволять программам, запущенным через cron, получать доступ к звуковым устройствам. Программы, работающие в пользовательских сессиях, могут не столкнуться с этой проблемой, если они имеют необходимые привилегии.
-
Использование GUI-приложений: Если ваше аудиоприложение (например,
mpg123
илиffplay
) требует доступа к графической среде (особенно если вы используете интерфейс с GUI), задача cron не сможет его получить.
Решения, которые могут помочь
-
Настройка crontab для запуска от имени пользователя: Один из способов обойти проблемы с окружением — запустить ваш скрипт от имени пользователя с полным окружением. Это можно сделать с помощью команды
su
. Пример записи в crontab:0 7 * * * su rick --login --command=/home/rick/musicCron.sh >> /home/rick/musicCron.log 2>&1
В этой команде
su
помогает вам имитировать полноценное пользователское окружение, что может дать доступ к аудиоустройствам. -
Использование специального программного обеспечения: Если
mpg123
вызывает ошибки (например, сегментационные ошибки), попробуйте использовать его альтернативы, такие какmplayer
илиffplay
, которые могут лучше работать в фоновом режиме. -
Запуск с использованием
at
вместоcron
: Если cron не подходит, вы можете использовать командуat
, чтобы запланировать выполнение вашего скрипта в определённое время, предоставляя все переменные окружения текущей сессии.echo "/home/rick/musicCron.sh" | at 07:00
-
Проверка системных журналов: Для диагностики проблем, связанных с запуском задач cron, полезно проверять системные журналы (например,
/var/log/syslog
или файлы журнала cron), чтобы выявить ошибки и исключения, которые могут помочь в их устранении.
Заключение
Запуск аудио через crontab может вызывать множество молодежных проблем из-за недостатка окружения и привилегий. Подходы, описанные выше, могут помочь вам настроить и оптимизировать вашу систему для успешного воспроизведения аудио. Если вы столкнулись с трудностями, не стесняйтесь обращаться к средствам диагностики и дополнительным ресурсам, которые могут помочь вам найти и исправить ошибки.