【问题标题】:Redirecting output of bluez btmgmt to file from systemd service将 bluez btmgmt 的输出重定向到来自 systemd 服务的文件
【发布时间】:2021-06-06 11:59:25
【问题描述】:

我尝试在使用蓝牙 btmgmt 实用程序连接期间使用单独的 ssp 模式。基本思路是扫描当前设备 OUI 并选择 ssp 开/关模式。但是当我将它们放入 .service 文件时,我无法从 btmgmt conbtmgmt info 命令中得到任何答案。我的系统是 Arch Linux arm 32 位,bluez 堆栈版本是 5.55-1。我试过了

[Unit]
Description=check Bluetooth address

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c '/usr/bin/btmgmt info >> /usr/local/lib/mac 2>&1'

没有任何成功:它只是在输出文件中没有放任何东西。加法之类的一些技巧

User=root
Group=root

或将 ExecStart 替换为

ExecStart=/bin/bash -c 'echo -e "$(btmgmt con)" >> /usr/local/lib/mac 2>&1

什么也没做。我尝试通过将 btmgmt 内容放在不同的 bash 脚本中而不是直接从服务文件中启动它们来进行更改,即

ExecStart=/usr/local/lib/test1

无济于事。我完全糊涂了,因为:

  1. 这似乎不是一般的 btmgmt 问题,因为我可以从服务文件设置 ssp 模式 以非常简单的方式,只需使用

    ExecStart=btmgmt 关闭

ExecStart=btmgmt off

即使没有完整路径。

  1. 似乎也不是重定向命令错误,因为如果我添加

    ExecStartPre=/usr/bin/bash -c '/usr/bin/fdisk -l > /usr/local/lib/mac 2>&1'

它确实可以正常工作,并且我在文件中看到了 fdisk 信息(我使用 fdisk 是因为它需要与 btmgmt 相同的提升权限)。 此外,btmgmt info 的工作方式相同,即在输出文件中不显示任何内容。这让我觉得 btmgmt 的输出有问题。我谈论输出是因为输入参数在 btmgmt ssp on/of 命令中工作正常,并且 journalctlsystemct 在 btmgmt con/info 案例中没有显示任何错误,所以看起来喜欢输出成功生成,然后发送到外太空的某个地方,但我不确定。 提前感谢您的任何帮助

【问题讨论】:

  • 是的,我试过 StandardOutput=file:/usr/local/lib/mac 并没有帮助我,我只是忘了提及。
  • 此外,我认为这根本不是重定向问题,因为我做了一些额外的检查并发现命令输出 btmgmt --help btmgmt --version重定向成功,btmgmt help 也是如此。但是包括 btmgmt 版本 在内的任何其他命令都不会产生任何输出(可能?)所以它看起来真的像 btmgmt 本身内部搞砸了。
  • 我可以想象btmgmt 从未打算以这种方式使用。更好的方法可能是有一个直接与套接字对话的脚本,详见文档git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/…

标签: bluez


【解决方案1】:

好吧,我声明:btmgmt 非常适合以任何方式用于输出,但他们尝试制作无数种输出变体,这些变体指向应该是的确切结果:错误被埋在深处的某个地方bt_shell_printf结构数据。我还没有准备好浏览所有令人作呕的文档代码(我的意思是完全没有 cmets 或或多或少令人满意的人),所以我最终得到了一个 liitte bit hacked 实用程序的版本,在输出中降级为简单的fprintf,只留下我需要的命令:con, ssp, power 并简化到只打印当前设置info。一切正常,我可以使用这种btmgmt,而不是只使用systemd,甚至使用udev规则(当然是间接的)

【讨论】:

    【解决方案2】:

    我知道这是一个老问题,但我遇到了同样的问题,经过数小时的尝试后设法解决了。

    我不知道为什么 btmgmt 会如此困难,但这是解决方法:

    [Unit]
    After=bluetooth.service
    Description=Bluetooth service
    
    [Service]
    ExecStart=<your-process>
    Group=root
    StandardInput=tty
    TTYPath=/dev/tty2
    TTYReset=yes
    TTYVHangup=yes
    Type=simple
    User=root
    

    基本上,通过占用一个 TTY,btmgmt 会认为它在交互式终端中运行,并且会照常输出。

    希望这能拯救我经历过的地狱!

    【讨论】:

      猜你喜欢
      • 2016-10-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 2014-11-22
      • 2014-06-22
      • 2013-12-28
      相关资源
      最近更新 更多