このチュートリアルでは、自分のアプリケーションを D-Bus 自動起動サービスの1つに変換する方法を説明する。D-Bus のこの機能は「D-Bus サービス・アクティベーション」とも呼ばれている。これは、自分のアプリケーションが実行されていないときであっても、必要に応じて D-Bus デーモン自体に同アプリケーションを起動させることによって、同アプリケーション宛ての D-Bus 呼び出しが上手く機能するようにするものである。
D-Bus デーモンは次のような機構を備えている。即ち、アプリケーション・プログラムが提供するサービスに対して D-Bus 呼び出しが行われた時に同アプリケーションがまだ実行状態になっていなかった場合に、そのアプリケーションを自動で起動する機構が備わっている。このチュートリアルでは、D-Bus 自動起動サービスを作成する方法と、そのインストール作業を CMake による構築作業(build)の中に組み込む方法とを説明する。
D-Bus サーバは、配信すべき D-Bus メッセージが届く度に、同メッセージが送信されたバス上で、同メッセージの宛先となるサービスを探す。
該当するサービスがその時点で登録されていなかった場合、D-Bus サーバは、D-Bus のデータ経路(例えば /usr/share/dbus-1/services
)にあるサービス・ディレクトリに保存されているファイル群を調べるところから始める。D-Bus サーバは、.service
ファイルを1つ1つ調べて一致するサービス名を探す。次いで D-Bus サーバは、このファイルを参考にして起動するアプリケーションを決め、同アプリケーションが起動し終わるのを待ってから、(ここまですべて上手く行っていれば)先のメッセージを配信する。
この作業は全て、メッセージの送信元アプリケーションには意識されない形で(送信元アプリケーションに対して透過的に)実施される。
サービス・ファイルは、標準的な .desktop
ファイルと同じく、単純な .ini
形式の設定ファイルである。
有効なサービス・ファイルは次の特徴を持つ。
.service
で終わる。[D-BUS Service]
グループの記述が1つある。Name
キーと Exec
キーの記述が1つづつある。サービス・ファイルの例を挙げる。MyApp
というアプリケーションのサービス・ファイルの中身は次のようなものになる。
[D-BUS Service] Name=org.kde.myapp Exec=/usr/bin/myapp
Name
キーと Exec
キーは、「.desktop
」ファイルを扱ったことがある人であれば見慣れたものであろう。けれども、「.desktop
」 とは異なり、Exec
の行には起動するアプリケーションの完全な経路(full path)を記述しなければならない。
上の例では、サービス org.kde.myapp
へメッセージが送られたものの、該当するサービスがそのバスにまだ登録されていなかった場合、/usr/bin/myapp
が起動する。その後は、適切なサービスをバスに登録するのは myapp の仕事である。
自分のアプリケーションのためのサービス・ファイルを作成したら、それをソース・ツリー内のどこかへ配置し、「.in
」のような拡張子(suffix)をファイル名に付け加える。これにより、構築作業中にサービス・ファイルを加工して Exec の項を調整するにあたって、ソース・ファイルを上書きせずに済ませることができるようになる。
この調整とインストールを行うには、簡単な CMake の指示(directive)を用いる。インストールで使う prefix の中身は構築実行時までわからないので、上のサービス・ファイルは少し修正する必要がある。もう一度 myapp を例に取ると、作成するファイルの名前は org.kde.myapp.service となり、その中身はつぎのようになる。
[D-BUS Service] Name=org.kde.myapp Exec=@CMAKE_INSTALL_PREFIX@/bin/myapp
そして、ファイル CMakeLists.txt
に次の2行を書き加える。
configure_file(org.kde.myapp.service.in ${CMAKE_CURRENT_BINARY_DIR}/org.kde.myapp.service) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.kde.myapp.service DESTINATION ${KDE_INSTALL_DBUSSERVICEDIR})
make install
を実行した時、適切に記述されたサービス・ファイルが生成され、ディスク上の正しい場所にインストールされる。サービス・ファイルの生成には、今しがた作成した .service
ファイルが利用される。これで読者のアプリケーションは必要な時に自動で起動されるようになった。
前の記事
D-Bus で独自型を使用する