Skip to content

D-Busを操作する

This content is a draft and will not be included in production builds.

D-Busの概要

Terminal window
busctl [--user] list

実行すると、NAMEPID または UNIT などのリストを得られる。このとき NAME はバスにおける接続名らしい。dbus-send(1)では name of a connection on the bus とある。

絞り込む機能は持っていないので、ps(1) と同様に grep(1) を併用する。

Terminal window
busctl --user list | grep -E 'PID|keyring'
Terminal window
busctl [--user] status [SERVICE]

SERVICE の部分は :1.90 のようなバスIDの場合もあるし、org.freedesktop.secrets のような名前の場合もある。

Terminal window
busctl [--user] tree [SERVICE]

ただし Introspect メソッドを実装している必要がある。

Terminal window
busctl [--user] introspect SERVICE OBJECT [INTERFACE]

ただし Introspect メソッドを実装している必要がある。

dbus-send コマンドを使う。

Terminal window
dbus-send [--system|--session] [--type=TYPE] [--dest=NAME] \
[--print-reply[=literal]]
<OBJECT_PATH> <INTERFACE.MEMBER> [CONTENTS ...]

D-Busにはシステム全体のバスとユーザーセッション固有のバスがあり、デフォルトはユーザーセッションを対象とするが、—system—session で明示できる。systemdではユーザーサービスが —user で、デフォルトはシステムなので合わせて欲しい気もするが、現状はそうなっていない。

D-Busにおけるメッセージの種類はもっと多いが、—type= フラグで有効なのは以下の2つ。

  • signal
  • method_call

—dest= フラグにはメッセージを送る対象のオブジェクト名を指定する。これは busctl list で取得した名前と同じだろう。OBJECT_PATH—dest= で指定したサービスが提供するオブジェクトなのだが、複雑なので説明はD-Busのオブジェクト階層に譲る。

Terminal window
dbus-send --session --print-reply --dest=org.lufia.factotum /org/lufia/factotum org.lufia.factotum.Keyring.OpenSession string:plain variant:string:

CONTENTS 部分はとても難しく、D-Busのメッセージ型を文字列で扱う必要がある。例えばバリアント型のパラメータに ok という文字列を渡す場合は variant:string:ok のように書く。

Terminal window
busctl monitor