D-Busを操作する
This content is a draft and will not be included in production builds.
バスのリストを取得
Section titled “バスのリストを取得”busctl [--user] list実行すると、NAME や PID または UNIT などのリストを得られる。このとき NAME はバスにおける接続名らしい。dbus-send(1)では name of a connection on the bus とある。
絞り込む機能は持っていないので、ps(1) と同様に grep(1) を併用する。
busctl --user list | grep -E 'PID|keyring'特定バスの情報を取得
Section titled “特定バスの情報を取得”busctl [--user] status [SERVICE]SERVICE の部分は :1.90 のようなバスIDの場合もあるし、org.freedesktop.secrets のような名前の場合もある。
オブジェクトリストを取得
Section titled “オブジェクトリストを取得”busctl [--user] tree [SERVICE]ただし Introspect メソッドを実装している必要がある。
受付可能なメソッド等を確認
Section titled “受付可能なメソッド等を確認”busctl [--user] introspect SERVICE OBJECT [INTERFACE]ただし Introspect メソッドを実装している必要がある。
サービス一覧の取得
Section titled “サービス一覧の取得”dbus-send コマンドを使う。
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のオブジェクト階層に譲る。
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 のように書く。
メッセージの監視
Section titled “メッセージの監視”busctl monitor