【发布时间】: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