pactl, вызываемый из службы systemd, всегда сообщает о сбое pa_context_connect (), в соединении отказано

Я установил служебный файл systemd для выполнения некоторых операций pactl при запуске системы для тестового процесса. Хотя команды работают нормально при выполнении с терминала, я всегда получаю сообщение «pa_context_connect () failed connection отклонено» при запуске того же сценария из службы systemd при запуске службы. Я также использую директиву User = в служебном файле, чтобы гарантировать, что пользователь с автоматическим входом соответствует пользователю, используемому для запуска служебных команд.

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


person Chris Morgan    schedule 10.02.2014    source источник


Ответы (1)


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

Обычный systemctl, PID 1, действительно не может получить доступ к переменным среды текущего пользователя при запуске службы. Поскольку pactl полагается на эти переменные, чтобы определить, к какому экземпляру pulseaudio необходимо подключиться, он не может этого сделать при запуске через службу. Я уверен, что для этого есть довольно грязный обходной путь, но я нашел кое-что получше.

В большинстве систем есть второй экземпляр systemd, работающий в пользовательском пространстве (доступный через systemctl --user, не подключенный как root). Этот экземпляр действительно может получить доступ ко всем переменным среды пользовательского пространства, и я обнаружил, что pactl не возвращает никаких ошибок при вызове напрямую или через скрипт.

Все, что вам нужно сделать, это поместить свои службы в /usr/lib/systemd/user/, /etc/systemd/user/ или ~/.config/systemd/user/, удалить директиву User= из файла службы и запустить systemctl --user daemon-reload как обычный пользователь, чтобы убедиться, что они были обнаружены.

person Santo Guevarra    schedule 23.11.2014