【问题标题】:Create pulseaudio socket at system startup in Ubuntu 16.04在 Ubuntu 16.04 系统启动时创建 pulseaudio 套接字
【发布时间】:2019-07-27 17:47:55
【问题描述】:

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

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

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

为了确保在 docker 启动容器之前始终创建 pulseaudio.socket,我将代码 "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

我的主要目标是在 docker 启动之前或在 docker 尝试使用重启策略启动容器之前创建 /tmp/pulseaudio.socket 文件。

或者有什么方法可以让 docker 服务首先检查 pulseaudio.socket 文件存在,如果存在则只启动 容器?

我该怎么做?

【问题讨论】:

    标签: docker ubuntu-16.04 audio-streaming pulseaudio


    【解决方案1】:

    我这样解决了这个问题:

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

    上一条命令

    sudo docker run --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 任何东西"

    当前命令

    sudo docker run --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直接捕获了声卡)在主机上。如果有人需要更多帮助,请告诉我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2016-04-03
      • 2017-09-01
      • 1970-01-01
      • 2018-12-20
      • 2016-11-27
      相关资源
      最近更新 更多