在 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.local 或 init.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直接捕获声卡)在宿主机上。让我知道是否有人需要更多帮助
我正在 运行安装一个 docker 容器,并将脉冲服务器环境变量传递到我的容器。容器设置为始终重启策略。如果 "pulseaudio.socket" 不在 /tmp 文件夹中,则容器无法 运行。
因此,为了实现我的目标,我将命令 "pactl load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket"
添加到启动应用程序 [通过搜索启动程序访问的 GUI 程序]。此命令在 /tmp 文件夹
如果 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.local 或 init.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直接捕获声卡)在宿主机上。让我知道是否有人需要更多帮助