我已经设置了一个systemd服务文件,以便在系统启动时为测试过程执行一些pactl操作。虽然从终端执行命令时工作正常但是当通过启动服务从systemd服务运行相同的脚本时,总是得到“pa_context_connect()连接被拒绝”。我还在服务文件中使用'User ='指令,以确保自动登录用户与用于运行服务命令的用户匹配。
我已经读过,这在某种程度上与pulseaudio会话在systemd服务的无环境环境中无效有关,但我无法进一步解决这个问题。
答案 0 :(得分:3)
虽然对于你可能正在进行的任何项目来说可能有点迟,但这是我发现的。
常规systemctl(PID 1)在启动服务时确实无法访问当前用户的环境变量。由于pactl依赖于这些变量来查找它需要连接的pulseaudio的实例,因此在通过服务启动时无法执行此操作。我确信这有一个相当肮脏的解决方法,但我找到了更好的东西。
大多数系统都有第二个systemd在用户空间运行的实例(可通过systemctl --user
访问,而不是以root身份连接)。这个实例确实可以访问所有用户空间环境变量,我发现pactl在直接或通过脚本调用时不会返回任何错误。
您需要做的就是将服务放在/usr/lib/systemd/user/
,/etc/systemd/user/
或~/.config/systemd/user/
中,从服务文件中删除User=
指令并运行{{1作为常规用户,以确保他们已被检测到。