web-dev-qa-db-ja.com

ログインセッション全体でD-Busセッションを再利用する

複数のログインセッションを通じてマシンにアクセスします。セッションの存続期間は重複する場合と重複しない場合があります。私の場合、これらのログインセッションは現在常にSSH経由ですが、ローカルセッションも処理したいと思います。

これらのセッションでD-Busが必要になることがあり、これらのログインセッション間で同じD-Busセッションを共有したい GVFSを使用するため

これを行うための推奨方法は何ですか?私が気づいていないD-Busの使用を中断したくありません。私は使用を検討しました

_export $(dbus-launch --autolaunch $(cat /var/lib/dbus/machine-id))
_

(Ubuntu 12.04以降)これは正しくないようです:

  • これにはXセッションが必要ですが、SSHセッションはXディスプレイを転送している場合と転送していない場合があり、同じ_$DISPLAY_がないものも転送されます。
  • xディスプレイが利用できない場合、_dbus-launch_は「自動起動エラー:X11初期化に失敗しました」と文句を言います。デーモンを起動しません。
  • _dbus-launch_のマニュアルページには、「_--autolaunch_オプションは内部実装の詳細(…)と見なされます。とにかくlibdbus実装の外でそれを使用する本当の理由はありません。」

_dbus-launch_またはD-Busスイートの他のツールは、実行中の_dbus-daemon_の自動検出とそれに接続することをサポートしていますか? D-BusがX接続で開始されている場合、必要な情報は~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-${DISPLAY#*:}にありますが、X接続が利用できない場合はどこにも保存されないようです。

自分のD-Busセッションファイルを丸める必要がありますか?その場合、_~/.dbus/session-bus_ディレクトリ内のファイルを使用する必要がありますか?パスは_/var/lib/dbus/machine-id_は信頼でき、移植可能ですか?

DBusは、dbusデーモンの設定の共有を少しトリッキーにします。

私のセットアップでは、dbus-launch --sh-syntaxからの設定は、.bash_rcによってソースとなるファイルに保存されます。これの欠点は、再起動するたびに、そのプロセスが手動で実行されることです。

ただし、既存のDBusデーモンを確認することは非常に簡単です。設定ファイルが$ HOME/.dbus_settingsにあるとしましょう:

need_start=1

if [ -r "$HOME/.dbus_settings" ]
then
    . "$HOME/.dbus_settings"
fi

if [ -n "$DBUS_SESSION_BUS_PID" ]
then
    if kill -0 "$DBUS_SESSION_BUS_PID" 2>/dev/null
    then
        need_start=0  # Found one
    fi
fi

if [ "$need_start" -ne 0 ]
then
    dbus-launch --sh-syntax >"$HOME/.dbus_settings"
    . "$HOME/.dbus_settings"
fi

--autolaunchオプションなしでは、Xウィンドウ接続が必要だとは思いません。

6
ash