可用的 D-Bus 服务列表

mad*_*end 82 linux d-bus ipc

是否有可用 D-Bus 服务列表之类的东西?我偶然发现了一些,比如 NetworkManager、Rhythmbox、Skype、HAL 提供的那些。

我想知道是否可以找到一个相当完整的提供服务/接口的列表。

don*_*sti 108

QT设置(简短的命令和干净的、人类可读的输出)上,您可以运行:

qdbus
Run Code Online (Sandbox Code Playgroud)

将列出会话总线上可用的服务和

qdbus --system
Run Code Online (Sandbox Code Playgroud)

将列出系统总线上可用的服务。


在任何设置上,您都可以使用 dbus-send

dbus-send --print-reply --dest=org.freedesktop.DBus  /org/freedesktop/DBus org.freedesktop.DBus.ListNames
Run Code Online (Sandbox Code Playgroud)

就像qdbus,如果--session指定或没有指定消息总线,dbus将发送到登录会话消息总线。所以上面将列出会话总线上可用的服务。
使用--system,如果你想,而不是使用系统范围的消息总线:

dbus-send --system --print-reply --dest=org.freedesktop.DBus  /org/freedesktop/DBus org.freedesktop.DBus.ListNames
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢图形工具,也可以使用DFeet(有关更多 GUI 选项,请参阅其他答案)。


Pit*_*kos 37

python方式是美丽的方式。

系统服务:

import dbus
for service in dbus.SystemBus().list_names():
    print(service)
Run Code Online (Sandbox Code Playgroud)

会话服务:

import dbus
for service in dbus.SessionBus().list_names():
    print(service)
Run Code Online (Sandbox Code Playgroud)


dai*_*isy 33

qdbusviewer是你最好的朋友; 它也允许您发送 D-bus 消息:

qdbusviewer 显示带有三个子面板的会话总线选项卡

  • 我什至无法在 Ubuntu 14.04 上启动它。它失败了:`qdbusviewer: could not exec '/usr/lib/i386-linux-gnu/qt4/bin/qdbusviewer': No such file or directory` (6认同)
  • @Pithikos `d-feet` 从今天开始工作。 (4认同)
  • @sherrellbc 请考虑添加“d-feet”作为答案,以使其更加明显 (3认同)

小智 14

gdbus是 glib2 的一部分,支持 Bash 补全。这是如何使用它(在 Fedora 上):

bash-4.4$ source /usr/share/bash-completion/completions/gdbus
bash-4.4$ gdbus call --system --dest <TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

这将显示所有可能的目的地。要获取可用接口的列表,DBus 导出该org.freedesktop.DBus.ListNames方法。您可以通过运行来调用它:

gdbus call --system --dest org.freedesktop.DBus \
           --object-path /org/freedesktop/DBus  \
           --method org.freedesktop.DBus.ListNames
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致不可读的输出。幸运的是输出是有效的python,所以这是可能的:

gdbus call --system --dest org.freedesktop.DBus      \
           --object-path /org/freedesktop/DBus       \
           --method org.freedesktop.DBus.ListNames | \
    python -c 'import sys, pprint; pprint.pprint(eval(sys.stdin.read()))'
Run Code Online (Sandbox Code Playgroud)

我通常不这样做,但这是一个很好的技巧。gdbus在开始编写代码之前,我用于内省和证明概念。bash 完成可以节省大量输入并避免输入错误。gdbus显示更好的输出会很好。


小智 13

我更喜欢busctl
请注意,与其他工具(例如qdbus和)不同,dbus-send此工具默认使用总线--system,因此要与会话管理器通信,您必须显式使用该--user开关。另外,list如果没有指定命令,则该命令是默认操作

总线控制

是相同的

Busctl 列表--系统

或者

# busctl list
NAME                                             PID PROCESS         USER             CONNECTION    UNIT                                                               SESSION DESCRIPTION
:1.0                                             162 systemd-timesyn systemd-timesync :1.0          systemd-timesyncd.service                                          -       -          
:1.1                                             157 systemd-network systemd-network  :1.1          systemd-networkd.service                                           -       -          
:1.10                                            199 phosphor-dump-m root             :1.10         obmc-dump-monitor.service                                          -       -          
:1.11                                            216 fru-device      root             :1.11         xyz.openbmc_project.FruDevice.service         
...
Run Code Online (Sandbox Code Playgroud)

当你看到每一个的树之后

# busctl tree :1.0
`-/org
  `-/org/freedesktop
    |-/org/freedesktop/LogControl1
    `-/org/freedesktop/timesync1
Run Code Online (Sandbox Code Playgroud)