如何在 dbus 信号上运行脚本?

如何在 dbus 信号上运行脚本?

是否可以在任意 dbus 信号上运行脚本?像 Upstart 这样以非特权用户身份运行且不需要 root 权限即可修改的脚本?

我之所以问这个问题,是因为我已经写了一个愚蠢的脚本,等待蓝牙事件来启动我的音乐播放器。现在,当我的机器连接到特定网络或连接其他设备时,我想做类似的事情。

编辑:我最初的问题没有具体说明这一点,但我的意思是“将多个脚本与一组事件之一关联起来”——所以我会使用相同的启动器(如 Upstart)来管理多个脚本,每个脚本都关注不同的 dbus 信号。全部在用户空间中。

答案1

你需要dbus-monitor

脚本看起来类似于

#!/bin/bash

interface=org.gnome.Rhythmbox.Player
member=playingUriChanged

# listen for playingUriChanged DBus events,
# each time we enter the loop, we just got an event
# so handle the event, e.g. by printing the artist and title
# see rhythmbox-client --print-playing-format for more output options

dbus-monitor --profile "interface='$interface',member='$member'" |
while read -r line; do
  printf "Now playing: "
  rhythmbox-client --print-playing
done

取自堆栈溢出

答案2

为此,我编写了一个简单的工具:https://github.com/jluttine/dbus-listen

与其他答案中相同的示例如下所示。编写收到信号时应执行的脚本:

#!/bin/bash
printf "Now playing: "
rhythmbox-client --print-playing

监听信号(假设上述脚本名为myscript.sh):

dbus-listen --interface org.gnome.Rhythmbox.Player --member playingUriChanged myscript.sh

当您需要监听系统总线时,使用的另一个答案dbus-monitor不起作用。

相关内容