【问题标题】:Failed to capture microphone input using pulseaudio as a systemd unit使用 pulseaudio 作为系统单元捕获麦克风输入失败
【发布时间】:2018-08-15 10:57:53
【问题描述】:

我创建了一个小型 go 程序,它使用 these go 绑定来记录来自默认麦克风的一些命令并采取相应的行动。它可以作为独立的二进制文件正常工作(作为普通用户和 root 用户),但是当我尝试将其转换为 systemd 单元时,go 绑定中的 Capture 函数失败,错误提示为 connection refused

程序在作为 systemd 服务运行时无法捕获麦克风输入。以下是几乎从here复制粘贴的单元文件。

[Unit]
Description=Commander service providing voice commands

[Service]
ExecStart=/path/to/binary/binary.sh

[Install]
WantedBy=multi-user.target

binary.sh 是一个简单的 shell 脚本,用于为 go 二进制文件提供环境变量。脚本如下

#!/bin/bash
cd /path/to/binary
env LD_LIBRARY_PATH=/usr/local/lib ./binary > stdout 2> stderr

pocketsphinx 共享库需要 LD_LIBRARY_PATH,该共享库用于识别来自音频的命令。

我认为单元文件有问题,但我不知道它是什么。整个项目可以在here找到。

任何见解都会有所帮助。谢谢。

【问题讨论】:

  • PulseAudio 通常在登录用户会话的上下文中运行,音频输入/输出仅适用于在该会话内运行的程序。系统服务应该不可能从用户会话中运行的 PulseAudio 获取麦克风音频,因为这将是严重的安全漏洞。
  • 嗨,迈克尔。这很有意义。但是应该可以使用systemd.. 在用户会话中运行服务?还是我必须使用桌面环境的自动启动机制来实现我想要的..?
  • systemd 服务永远不会在用户的桌面会话中运行。
  • 听起来这作为 systemd 用户服务运行是有意义的(就像 PulseAudio 本身一样)。
  • @LucasWerkmeister 它奏效了。谢谢。

标签: linux go systemd pulseaudio


【解决方案1】:

pulseaudio 是一个可能尚未启动的守护进程...更新您的binary.sh

sleep 10
echo about to determine whether pulseaudio is up and running
pulseaudio --check
echo if pulseaudio is running above check silently returns

在启动你的 golang 二进制文件之前

【讨论】:

  • 嗨 Scott,感谢您的输入,但 pulseaudio 正在运行。我正在与二进制文件并排测试服务。二进制文件正在运行,但服务给我带来了问题。解决此问题后,我将添加此检查。
【解决方案2】:

需要设置XDG_RUNTIME_DIR环境变量到目录/run/user/<USER_ID>,例如

[Service]
Environment="XDG_RUNTIME_DIR=/run/user/1001"
ExecStart=/path/to/binary/binary.sh

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多