是否可以在任意 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
不起作用。