X session manager
X session manager は X Window System 内で働くセッション管理プログラムである。このプログラムによって、稼働中のアプリケーション群の実行状態を保存し、復元することが可能になる。
目次
概略
X session manager にとって、セッションとは特定時点における「デスクトップの状態」である。ウィンドウの集まりに、ウィンドウの現在の内容を加味したものとも言える。より正確には、セッションは次の二つのものから成る。一つは、これらのウィンドウを管理するクライアントと、ウィンドウに紐づけられて動作するクライアントとの集合であり、もう一つは、このようなアプリケーション群が必要に応じてウィンドウの状態を復元できるようにする情報である。
セッションマネージャ(session manager)を使うことの最大の利点は、対話型セッションからログアウトし、後に再ログインした時、ログアウト時と同じウィンドウ群を同じ状態で見られることである。これが機能するには、セッションマネージャのプログラムによってログアウト時点で実行中であったアプリケーションの名前が記録され、ログイン時に再び開始されるようになっていなければならない。加えてアプリケーションには、セッションマネージャからの要求に従って自身の実行状態を保存する仕組みと、保存された実行状態を再開時に読込む仕組みが備わっている必要がある。この仕組みによってアプリケーションの実行状態(これはウィンドウの中身の復元に欠かせない)が復元される。
通常、セッションの保存や読込みは、利用者のログイン・ログアウトを待つことなく、いつでもできる。異なるセッションを多数保存し、そのうちの一つだけを利用者の選択にしたがって読込むことも可能。セッションはそれを構成するアプリケーション群の目録を以て規定することもできる。結果、利用者はセッション群の保存方法として二つの選択肢を得る。一つは動作中のアプリケーションの実行状態を記録する方法。もう一つはセッションを構成するアプリケーションを明示的に列挙する方法である。こうして、利用者は特定のセッションを後で読込むことが可能となる。
アプリケーションには必要に応じて自身の状態を記録したり読込んだりする仕組みが備わっている。この仕組み無しには、個々のセッションの情報にアプリケーションの状態を含めることはできない。X Session Management Protocol(XSMP)という名前のプロトコルで、アプリケーションとセッションマネージャがどのように情報交換するのかが規定されている。ウィンドウ・マネージャ(window manager)とセッションマネージャとが通信可能なのは特筆すべき点である。これはウィンドウの配置とアイコンの表示がウィンドウ・マネージャに担われているからである。状態記録機能を欠いたアプリケーションもセッションに含めることはできるが、一つのセッションから別のセッションへ、そのアプリケーションの状態を保存することはできない。
X Window System には xsm と呼ばれる標準のセッションマネージャがある。特定のデスクトップシステム向けに開発されたセッションマネージャもいくつか存在する。例えば、KDE の標準セッションマネージャである ksmserver など。
プロトコル
XSMP は Inter-Client Exchange Protocol の下位プロトコルである。クライアントのセッションマネージャへの接続からプロトコルの手続きが始まる。セッションマネージャがネットワーク上でどのように位置づけられるのかはシステムに依る。POSIX システムでは環境変数 SESSION_MANAGER が存在し、クライアント起動時には、この変数に適切な値が設定される。
識別子
プロトコルは次の二つの事実を考慮して作られている。
- セッションが正しく再開されるには、セッション内で実行中だったアプリケーション群が単に再開されるというだけでなく、それらの以前の状態を復元する形で再開される必要がある。
- 一つのセッションの中で、あるいは異なるセッションの中で、同一のアプリケーションが複数動いていることもありうる。
同一アプリケーションの異なるインスタンスが、一つのセッションあるいは複数の異なるセッションで同時に動いていることがあり得る。そしてこれらのインスタンスは大抵各々違った実行状態を持つ。例として次の場合を考える。即ち、利用者が /etc/passwd に対してテキストエディタを立ち上げ、それから同じセッション内で letter.txt に対しても新しくエディタを起こし、さらに別のセッションで todo.txt を開くべくエディタを起動した場合である。
セッションを適切に復元するには、同一のアプリケーションの異なるインスタンスはセッションマネージャに別々の物だと認識されなければならない。そのため、セッションマネージャでは個々のアプリケーションの一つ一つのインスタンスに唯一無二の識別子が割り当てられる。こうして /etc/passwd を開いているテキストエディタと todo.txt を開いているものとが、同じプログラムの二つのインスタンスであっても、セッションマネージャに区別されるようになる。
識別子は唯一無二のものでなければならない。より正確にいえば、セッションマネージャによって管理される全てのセッションを通じて、唯一無二でなければならない。/etc/passwd を開いているテキストエディタの識別子は、letter.txt を開いている同じテキストエディタのそれと異なるだけでなく、別のセッション内で todo.txt を編輯しているテキストエディタのものとも相違するということである。クライアントの識別子はセッションの終了・再開の前後で変化しない。
プロトコルの主要部
セッション管理プロトコルの主要部は以下の通り。
- セッションマネージャによって唯一無二の識別子が全てのクライアントに割り当てられる。
- セッションマネージャからクライアントへ、各自で状態保存を図るよう要請が送られる。
- クライアント側で、正しく状態を復元するためには自身がどのように再開されるべきなのか、が規定される。(例えば、プロセスを開始するための命令文など。)
最後の段が可能なのは、セッションマネージャによって全クライアントのプロパティの集まりが保持されているからである。(X Window System の用語においては、「プロパティ」は単にデータの容れ物を表す。)これらの情報の各部はクライアントによっていつでも変更されうる。プロパティの一つに RestartCommand という名のものがあり、クライアントの再開方法に関する情報が入っている。
セッションマネージャからクライアントへ自身の状態を保存するよう要請が送られたとき、アプリケーションは次の処理を行う。
- アプリケーションは、二つの異なるインスタンスの状態が区別できるような形で、自身の状態を保存する。これは状態を保存した文書の名前に識別子を含める等の方法で実現される。
- アプリケーションは、再開方法の詳細を RestartCommand プロパティに記録する。このプロパティにはクライアントの識別子が含まれていなければならない。なぜかというと、
- アプリケーションは再開時にも識別子を保持していなければならない上に、
- 状態を復元するにあたって識別子が要る。(例えば、状態が記録されている文書を探し出すのに必要。)
セッションマネージャには RestartCommand の他にも複数のプロパティが管理されている。例として、セッションが破壊された時のアプリケーションの振舞いを定めるプロパティが挙げられる。
局所状態と広域状態
クライアントが自己の状態を保存するよう要請された時、ウィンドウ・マネージャによって、局所(local)のみで通用する状態として保存されるべきか、広域(global)で通用する状態として保存されるべきかが定められる。違いは保存の成果物が他のアプリケーションから閲覧・解釈できるか否かである。
テキストエディタの場合、広域状態で保存するとは普通に文書を保存することであり、他のアプリケーションで更新された文書を使用できる。局所状態で保存するとは、局所的な文書の複製を保存することであり、他のアプリケーションからは加工前の元の文書が見られる。
一例
以下はセッションマネージャと仮想のテキストエディタ xyz とのやり取りの大まかな手順を示したものである。アプリケーションが初めてセッション内で開始されてから、利用者がログアウトし、再びログインするまでを説明する。
- アプリケーションが Inter-Client Exchange Protocol に則って、セッションマネージャに接続される。
- アプリケーションからセッションマネージャへ、これが初回の起動であり、前回使用した識別子は存在しないこと(従って前回の状態も存在しないこと)が伝えられる。
- 応答としてセッションマネージャからクライアントへ唯一無二の識別子が送られる。ここではその識別子を「4324」としておく。
- クライアントはセッションマネージャから、即座に局所状態を保存するよう要求される。(この作業はクライアントの初回起動時に限られる)
- クライアントにより、セッションマネージャの RestartCommand プロパティとして、命令文「xyz -sid 4324」が記録される。(システムによって異同がある。POSIX システムでは、このプロパティに argv 配列が含まれる。)
- クライアントによって局所状態が記録される。例えば、編輯中の文書の名前と他の全ての情報(編輯箇所の行番号など)を局所文書「.temp-4324」に記録する。
- 利用者がログアウトする時、セッションマネージャから全てのクライアントへ通達が送られ、各自で状態を保存する必要があると告げられる。
- クライアント 4324 の情報が再び編輯される。
- 全てのクライアントからセッションマネージャへ状態保存完了が伝えられたら、セッションマネージャによって session が閉じられる。
クライアントが状態を保存するよう要請されたとき、利用者と限定されたやり取りを行うことも可能である(例えば、利用者に編輯中の文書を保存するか否かを問う)。いづれにせよ、状態が保存されたら、クライアントからセッションマネージャへ適切な通知が送られる。
セッションが再開されるときは次の手順。
- セッションマネージャによって、クライアント 4324 用の RestartCommand プロパティに保存されていた命令文が実行され、クライアント 4324 が再開される。
- この方法ゆえに、アプリケーションは「xyz -sid 4324」として開始され、識別子が定まる。
- アプリケーションの状態情報が文書「.temp-4324」から取得される。
- アプリケーションは識別子 4324 を指定した上でセッションマネージャに接続される。こうすることで、新規のクライアントではなく既存のクライアントの再起動だと、セッションマネージャに知れる。
クライアントによるセッション管理
XSMP ではセッションマネージャを次のように定義している。即ち、他のアプリケーション群を実行し、その状態を制御するプログラム全て、という定義である。結果、クライアントは自ら、他のクライアント群のセッションマネージャたり得る。例えば、e メールを書くにあたって、メール・クライアントからテキストエディタを起動できる。このとき、エディタに対して、メール・クライアントはセッションマネージャとして機能する。この仕組みによって、メール・クライアントを一旦閉じてから再起動しても、テキストエディタの状態を復元できるようになる。
沿革
GNOME session manager では 2.24 版から XSMP に替えて D-Bus が採用されている。