bash - Ubuntu为另一个用户设置脉冲音频接收器

标签 bash shell ubuntu ubuntu-20.04 pulseaudio

我正在运行带有 displaylink 5.4.1 的 targus 坞站 (DOCK191USZ),它会定期崩溃,但会自动重新加载。不幸的是,当它这样做时,默认声音输出会更改回线路输出,而不是我的蓝牙扬声器。
我编写了一个脚本来检查蓝牙扬声器,如果已连接,则将音频输出更改回它们,但是如果我尝试以 root 用户身份运行脚本,它就看不到脉冲音频守护进程。
即使将 $XDG_RUNTIME_DIR 变量设置为正确的用户 PID,我仍然无法运行 pacmd 命令,因为它提示我不应该这样做。

XDG_RUNTIME_DIR (/run/user/1000) is not owned by us (uid 0), but by uid 1000! (This could e.g. happen if you try to connect to a non-root PulseAudio as a root user, over the native protocol. Don't do that.)
No PulseAudio daemon running, or not running as session daemon.
我还想将此脚本作为 systemd 服务运行,这样我就不必管理它,systemd 将确保它在系统启动时启动,等等。因此,它以 root 身份运行。我尝试以本地用户身份运行 systemd 服务,但它仍然看不到 pulseaudio 守护进程。
想法?当然,如果 displaylink 能修复他们的问题,这样它就不会崩溃,那就太好了,但让我们说实话,制造商的 ubuntu 软件支持在最好的日子里仍然不合标准。
脚本:
#!/bin/bash
logfile=/var/log/bluetooth/log
btsinkname=bluez_sink.60_F4_3A_71_89_E0.a2dp_sink
function btcheck {
  logprefix=$(echo "$(date +%b" "%d" "%H":"%M":"%S) $(hostname) btcheck [$(echo $BASHPID)]:")
  if [[ $(cat /sys/class/bluetooth/hci0:256/power/control 2>&1 | grep -Ec "^auto") -eq 1 ]]; then
    echo "$logprefix connected" | tee -a $logfile
    export XDG_RUNTIME_DIR=/run/user/1000
    pacmd set-default-sink $btsinkname 2>&1
  else
    echo "$logprefix not connected" | tee -a $logfile
  fi
  sleep 2s
  btcheck
}

btcheck

最佳答案

我太接近了。只是不得不使用我的大脑一点点。
代替

export XDG_RUNTIME_DIR=/run/user/1000
pacmd set-default-sink $btsinkname 2>&1
我不得不将它们结合起来并使用 runuser
userid=$(runuser -l username -c "id -u")
runuser -l username -c "export XDG_RUNTIME_DIR=/run/user/$userid && pacmd set-default-sink $btsinkname 2>&1"
现在随着 systemd 服务的运行,我的音频将被强制保持连接到我的蓝牙扬声器。只需等待一段随机时间,码头现在就会崩溃,以查看我的脚本是否有效。

关于bash - Ubuntu为另一个用户设置脉冲音频接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70706593/

相关文章:

git - 在 shell 提示符下显示 git 分支?

bash - Putty/Bash alt + 左/右箭头键按单词移动光标

linux - 删除与模式匹配的行

ruby-on-rails - 从 RubyMine 启动/调试 Rails 时缺少 Assets

bash - VSCode 终端不显示当前文件夹

json - 使用 Bash 变量构建 JSON 字符串

shell - neo4j-shell "connection refused"错误

linux - 在 Ubuntu(或任何 unix 类型的环境)中执行 shell 脚本时,如何在脚本之外持久保存导出?

c++ - valgrind 不正确的输出位置

php - 以 root/普通用户身份运行 eJabberd 注册用户命令