Есть ли какая-либо причина, по которой я не могу запустить аудио с помощью crontab?

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

Я хотел создать “радиостанцию-будильник” из старого ноутбука. Первый шаг заключался в том, чтобы заставить его воспроизводить аудио в определенное время, поэтому я создал этот скрипт:

#!/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:00
  • su это ‘заменить пользователя’; говорит оболочке 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. Ваша цель создании "радио-будильника" с помощью скрипта, который должен воспроизводить аудиофайл, вполне достижима, однако стоит учесть несколько важных моментов, которые могут препятствовать успешному воспроизведению.

Причины возможных проблем

  1. Ограниченное окружение: Задачи, запускаемые через crontab, обычно выполняются в минимальном окружении по сравнению с вашей обычной сессией пользователя. Это может означать, что такие переменные, как DISPLAY и другие настройки среды, не будут установлены, что уменьшит возможность воспроизведения аудио.

  2. Отсутствие доступа к звуковой карте: Система может не позволять программам, запущенным через cron, получать доступ к звуковым устройствам. Программы, работающие в пользовательских сессиях, могут не столкнуться с этой проблемой, если они имеют необходимые привилегии.

  3. Использование GUI-приложений: Если ваше аудиоприложение (например, mpg123 или ffplay) требует доступа к графической среде (особенно если вы используете интерфейс с GUI), задача cron не сможет его получить.

Решения, которые могут помочь

  1. Настройка crontab для запуска от имени пользователя: Один из способов обойти проблемы с окружением — запустить ваш скрипт от имени пользователя с полным окружением. Это можно сделать с помощью команды su. Пример записи в crontab:

    0 7 * * * su rick --login --command=/home/rick/musicCron.sh >> /home/rick/musicCron.log 2>&1

    В этой команде su помогает вам имитировать полноценное пользователское окружение, что может дать доступ к аудиоустройствам.

  2. Использование специального программного обеспечения: Если mpg123 вызывает ошибки (например, сегментационные ошибки), попробуйте использовать его альтернативы, такие как mplayer или ffplay, которые могут лучше работать в фоновом режиме.

  3. Запуск с использованием at вместо cron: Если cron не подходит, вы можете использовать команду at, чтобы запланировать выполнение вашего скрипта в определённое время, предоставляя все переменные окружения текущей сессии.

    echo "/home/rick/musicCron.sh" | at 07:00
  4. Проверка системных журналов: Для диагностики проблем, связанных с запуском задач cron, полезно проверять системные журналы (например, /var/log/syslog или файлы журнала cron), чтобы выявить ошибки и исключения, которые могут помочь в их устранении.

Заключение

Запуск аудио через crontab может вызывать множество молодежных проблем из-за недостатка окружения и привилегий. Подходы, описанные выше, могут помочь вам настроить и оптимизировать вашу систему для успешного воспроизведения аудио. Если вы столкнулись с трудностями, не стесняйтесь обращаться к средствам диагностики и дополнительным ресурсам, которые могут помочь вам найти и исправить ошибки.

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

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