入り口に戻る

原文はこちら。

原文は CC-BY-SA-4.0 で公開されており、本サイトのこのページも同じ。

# D-Bus 自動起動サービス

このチュートリアルでは、自分のアプリケーションを D-Bus 自動起動サービスの１つに変換する方法を説明する。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` ファイルを１つ１つ調べて一致するサービス名を探す。次いで D-Bus サーバは、このファイルを参考にして起動するアプリケーションを決め、同アプリケーションが起動し終わるのを待ってから、(ここまですべて上手く行っていれば)先のメッセージを配信する。

この作業は全て、メッセージの送信元アプリケーションには意識されない形で(送信元アプリケーションに対して透過的に)実施される。

## サービス・ファイルを作成する

サービス・ファイルは、標準的な `.desktop` ファイルと同じく、単純な `.ini` 形式の設定ファイルである。

有効なサービス・ファイルは次の特徴を持つ。

- ファイル名が `.service` で終わる。
- ファイル内に `[D-BUS Service]` グループの記述が１つある。
- ファイル内に `Name` キーと `Exec` キーの記述が１つづつある。

サービス・ファイルの例を挙げる。`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` に次の２行を書き加える。

> 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 で独自型を使用する

入り口に戻る