Рейтинг:3

Как воспроизвести звук из службы systemd в Ubuntu?

флаг in

Я пытаюсь воспроизвести звук из службы на Ubuntu:

tim@timpc:~$ uname -a Linux timpc 5.4.0-91-generic #102-Ubuntu SMP Fri 5 ноября 16:31:28 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Вот определение службы:

tim@timpc:~$ cat /etc/systemd/system/alarmd.service
# Дата /etc/systemd/system/alarmd.service
[Ед. изм]
Описание=сигнализация
Хочет=sound.target
После=звук.цель

[Оказание услуг]
Тип = ваншот
Окружающая среда = "ОТОБРАЖЕНИЕ =: 0"
Пользователь=тим
;ExecStart=/home/tim/Documente/super/alarmd/build/release/dist/alarmd --sound /usr/local/share/alarmd/a.wav
ExecStart=mplayer /usr/local/share/alarmd/a.wav

[Установить]
WantedBy=многопользовательская.цель

Я запускаю службу так:

sudo systemctl запустить alarmd.service

... и получить этот вывод:

tim@timpc:~$ journalctl -S сегодня -u alarmd.service
-- Журналы начинаются в среду 11-08-2021 09:41:59 CEST, заканчиваются в воскресенье 05-12-2021 16:28:06 CET. --
Дез 05 16:28:06 timpc systemd[1]: Запуск службы alarmd...
Дез 05 16:28:06 timpc mplayer[13082]: MPlayer 1.3.0 (Debian), собранный с помощью gcc-9 (C) 2000-2016 Команда MPlayer
Дез 05 16:28:06 timpc mplayer[13082]: do_connect: не удалось подключиться к сокету
Дез 05 16:28:06 timpc mplayer[13082]: подключение: Нет такого файла или каталога
Дез 05 16:28:06 timpc mplayer[13082]: не удалось открыть поддержку LIRC. Вы не сможете использовать пульт дистанционного управления.
Дез 05 16:28:06 timpc mplayer[13082]: Тип терминала «неизвестен» не определен.
Дез 05 16:28:06 timpc mplayer[13082]: Воспроизведение /usr/local/share/alarmd/a.wav.
Дез 05 16:28:06 timpc mplayer[13082]: версия libavformat 58.29.100 (внешняя)
Дез 05 16:28:06 timpc mplayer[13082]: Обнаружен формат файла только аудио.
Дез 05 16:28:06 timpc mplayer[13082]: загрузить субтитры в /usr/local/share/alarmd/
Dez 05 16:28:06 timpc mplayer[13082]: ==================================== ======================================
Dez 05 16:28:06 timpc mplayer[13082]: Открытие аудиодекодера: [pcm] Несжатый аудиодекодер PCM
Дез 05 16:28:06 timpc mplayer[13082]: АУДИО: 44100 Гц, 2 канала, s16le, 1411,2 кбит/100,00% (соотношение: 176400->176400)
Dez 05 16:28:06 timpc mplayer[13082]: Выбранный аудиокодек: [pcm] afm: pcm (несжатый PCM)
Dez 05 16:28:06 timpc mplayer[13082]: ==================================== ======================================
Дез 05 16:28:06 timpc mplayer[13082]: AO: [pulse] Инициализация не удалась: в соединении отказано
Дез 05, 16:28:06 timpc mplayer[13082]: не удалось инициализировать аудиодрайвер 'pulse'
Dez 05 16:28:06 timpc mplayer[13082]: [AO_ALSA] alsa-lib: pcm_hw.c:1715:(snd_pcm_hw_open) открыть '/dev/snd/pcmC0D0p' не удалось (-2): нет такого файла или каталога
Дез 05 16:28:06 timpc mplayer[13082]: [AO_ALSA] alsa-lib: pcm_dmix.c:1089:(snd_pcm_dmix_open) невозможно открыть подчиненное устройство
Дез 05 16:28:06 timpc mplayer[13082]: [AO_ALSA] Ошибка открытия воспроизведения: Нет такого файла или каталога
Дез 05, 16:28:06 timpc mplayer[13082]: не удалось инициализировать аудиодрайвер alsa.
Дез 05 16:28:06 timpc mplayer[13082]: [AO SDL] Частота дискретизации: 44100 Гц Каналы: Стерео Формат s16le
Дез 05, 16:28:06 timpc mplayer[13082]: [AO SDL] с использованием аудиодрайвера aalib.
Dez 05 16:28:06 timpc mplayer[13082]: [AO SDL] Невозможно открыть аудио: нет доступного аудиоустройства
Дез 05, 16:28:06 timpc mplayer [13082]: не удалось инициализировать аудиодрайвер «sdl: aalib»
Дез 05, 16:28:06 timpc mplayer[13082]: не удалось открыть/инициализировать аудиоустройство -> нет звука.
Дез 05 16:28:06 timpc mplayer[13082]: Аудио: нет звука
Дез 05 16:28:06 timpc mplayer[13082]: Видео: нет видео
Дез 05 16:28:06 timpc mplayer[13082]: Выход... (Конец файла)
Дез 05 16:28:06 timpc systemd[1]: alarmd.service: успешно.
Дез 05 16:28:06 timpc systemd[1]: завершение работы службы alarmd.

Как мне определить службу, чтобы звук воспроизводился?

Сама команда работает:

tim@timpc:~$ mplayer /usr/local/share/alarmd/a.wav
MPlayer 1.3.0 (Debian), собранный с помощью gcc-9 (C) 2000-2016 Команда MPlayer
do_connect: не удалось подключиться к сокету
connect: Нет такого файла или каталога
Не удалось открыть поддержку LIRC. Вы не сможете использовать пульт дистанционного управления.

Воспроизведение /usr/local/share/alarmd/a.wav.
libavformat версии 58.29.100 (внешняя)
Обнаружен только формат файла аудио.
Загрузить субтитры в /usr/local/share/alarmd/
================================================= ========================
Открытие аудиодекодера: [pcm] Несжатый аудиодекодер PCM
АУДИО: 44100 Гц, 2 канала, s16le, 1411,2 кбит/100,00% (соотношение: 176400->176400)
Выбранный аудиокодек: [pcm] afm: pcm (несжатый PCM)
================================================= ========================
АО: [импульсный] 44100 Гц 2 канала s16le (2 байта на выборку)
Видео: нет видео
Начало воспроизведения...
А: 9,1 (09,1) из 233,0 (03:53,0) 0,0% 


MPlayer прерван сигналом 2 в модуле: play_audio
А: 9,2 (09,1) из 233,0 (03:53,0) 0,0% 

Выход... (Выйти)
Marc Vanhoomissen avatar
флаг in
Не могли бы вы добавить «WantedBy=sound.target» в раздел «[Установить]»?
флаг in
'WantedBy=sound.target', к сожалению, не помогает
user10489 avatar
флаг in
Вы можете сделать это системным файлом пользователя в своей учетной записи вместо файла системного уровня, чтобы он запускался после того, как ваш сеанс входа в систему будет доступен. Если вы хотите воспроизводить звук, когда ни один пользователь не вошел в систему, ответ будет другим.
Рейтинг:3
флаг in

В текущих версиях Ubuntu звук обычно обрабатывается импульсным аудиосервером. Если вы запускаете звуковые проигрыватели из сеанса, вошедшего в систему, то проигрыватель найдет сервер через переменные среды. XDG_RUNTIME_DIR и/или PULSE_RUNTIME_PATH. Чтобы задание в systemd (или cron) могло найти сервер, ему потребуются эти значения.

К счастью, эти значения предсказуемы по имени пользователя и не должны меняться от одного входа в систему к другому, если это один и тот же пользователь. (Параметр ОТОБРАЖАТЬ была хорошая попытка, но не правильная переменная сеанса.)

Например, если пользователь tim является первым пользователем в системе, его uid, скорее всего, равен 1000 (проверьте /etc/passwd или введите я бы или проверьте текущие значения.) Добавьте в файл systemd следующее: (Не уверен, что один из них достаточно хорош или вам нужны оба, это может зависеть от версии.)

Окружающая среда = "XDG_RUNTIME_DIR =/выполнить/пользователь/1000"
Среда="PULSE_RUNTIME_PATH=/run/user/1000/pulse/"

Поскольку это работает только тогда, когда вы в любом случае вошли в систему, альтернативой файлу systemd может быть запуск вашей службы в сценарии, который запускается как часть вашего сеанса gnome. Если бы вы сделали это, вам вообще не нужно было бы беспокоиться о переменных сеанса.

флаг in
Большое спасибо!
Рейтинг:0
флаг cn

Я бы прокомментировал это, но у меня недостаточно очков репутации, поэтому, пожалуйста, извините меня за то, что я оставил ссылку без каких-либо объяснений (даже если это описано как плохой ответ в руководстве по публикации).

Эта ссылка может помочь. Это объясняет что-то похожее, а именно то, как вы можете запустить приложение или процесс с помощью systemd. если вы сможете найти команду для воспроизведения звукового файла и поместить ее в systemd, вы сможете добиться того, чего хотите.

ссылка здесь (верхний ответ предоставит шаги, необходимые для добавления команды в systemd)

Имейте в виду, что редактирование systemd может привести к тому, что ваш компьютер перестанет загружаться, если вы сделаете это неправильно, поэтому, возможно, сначала протестируйте это решение на виртуальной машине.

РЕДАКТИРОВАТЬ: вы можете воспроизводить звуковые файлы из bash, используя эти команды.

флаг in
сама команда работает. Смотрите вывод в моем вопросе.

Ответить или комментировать

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