4

我已经设置了一个 systemd 服务文件以在系统启动时执行一些 pactl 操作以进行测试过程。虽然从终端执行命令时可以正常工作,但通过启动服务从 systemd 服务运行相同的脚本时,我总是得到“pa_context_connect()失败连接被拒绝”。我还在服务文件中使用了“User=”指令,以确保自动登录用户与用于运行服务命令的用户匹配。

我已经读到这在某种程度上与 pulseaudio 会话在 systemd 服务的无环境上下文中无效有关,但我无法进一步弄清楚。

4

1 回答 1

7

尽管对于您可能正在从事的任何项目来说可能有点晚了,但这就是我发现的。

常规 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以普通用户身份运行以确保它们已被检测到。

于 2014-11-23T17:11:16.487 回答