在 Ubuntu 16.04 系统启动时创建 pulseaudio 套接字

Create pulseaudio socket at system startup in Ubuntu 16.04

我正在 运行安装一个 docker 容器,并将脉冲服务器环境变量传递到我的容器。容器设置为始终重启策略。如果 "pulseaudio.socket" 不在 /tmp 文件夹中,则容器无法 运行。

因此,为了实现我的目标,我将命令 "pactl load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket" 添加到启动应用程序 [通过搜索启动程序访问的 GUI 程序]。此命令在 /tmp 文件夹

中创建一个 pulseaudio.socket 文件

如果 pulseaudio.socket 文件是在 docker 启动容器之前创建的,则此方法大部分时间都有效。如果 docker 在创建 pulseaudio.socket 之前启动容器,则容器无法启动。

为了确保 pulseaudio.socket 始终在 docker 启动容器之前创建,我将代码 "pactl load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket" 添加到 /etc/rc.local 并尝试将其添加到 init.d.

但是将代码添加到 /etc/rc.localinit.d 会创建一个 pulse-PKdhtXMmr18n 文件夹在 /tmp 文件夹而不是文件 pulseaudio.socket

如何确保始终创建名为 pulseaudio.socket 的文件而不是 pulse-PKdhtXMmr18n

我的主要 objective 是在 docker 开始之前或 docker 尝试开始之前创建 /tmp/pulseaudio.socket 文件具有重启策略的容器。

Or is there any way such that the docker service first checks if the pulseaudio.socket file exists and if it exists then only start the containers?

我该怎么做?

我是这样解决问题的:

我的容器有一个启动应用程序的节点脚本,这个应用程序需要 pulseaudio 到 运行 正确。所以这是我的 docker 运行 命令。 注意粗体代码。那是我修改的。

上一个命令

sudo docker 运行 --pid=host -dit --restart unless-stopped --env PULSE_SERVER=unix:/tmp/pulseaudio.socket --env PULSE_COOKIE=/home/$USER/pulseaudio.cookie --volume /tmp/pulseaudio.socket:/tmp/pulseaudio.socket --volume /home /$USER/pulseaudio.client.conf:/etc/pulse/client.conf --user $(id -u):$(id -g) --privileged --net=host ubuntu bash -c "node service.js && tail -F anything"

当前命令

sudo docker 运行 --pid=host -dit --restart unless-stopped --env PULSE_SERVER=unix:/tmp/pulseaudio.socket --env PULSE_COOKIE=/home/$USER/pulseaudio.cookie --volume /tmp:/tmp --volume /home/$USER/pulseaudio.client.conf:/etc/pulse/client.conf --user $(id -u):$(id -g) --privileged --net=host ubuntu bash -c "sh checksocket.sh && tail -F 任何东西

在前面的命令中,只有当主机的 /tmp 文件夹中有 pulseaudio.socket 文件时,容器才会启动。

现在当前的工作命令挂载 --volume /tmp:/tmp 而不是 --volume /tmp/pulseaudio.socket:/tmp/pulseaudio.socket

sh checksocket.sh 命令执行我在容器内创建的 checksocket.sh 文件。

这是我的 checksocket.sh 文件的代码:

#!/bin/bash
while sleep 0.5;
do if [ -e /tmp/pulseaudio.socket ]
then
value="node service.js"
exec $value
break
fi
done

此 shell 脚本不断检查挂载的 /tmp 文件夹中的 pulseaudio.socket 文件,如果它存在,那么它只会启动我的节点服务。

通过这种方式,只要我重新启动我的机器,我的容器就会启动,一旦 shell 脚本在 /tmp 文件夹中检测到 pulseaudio.socket,节点服务就会启动。

我希望这能帮助那些试图将 pulseaudio 与 docker 一起用于声音多路复用或避免“设备或资源繁忙”错误的人(当您使用 docker用alsa作为alsa直接捕获声卡)在宿主机上。让我知道是否有人需要更多帮助