跨登录会话重用 D-Bus 会话

Gil*_*il' 20 d-bus session

我通过多个登录会话访问一台机器。会话的生命周期可能重叠也可能不重叠。就我而言,这些登录会话目前始终通过 SSH,但我也更愿意处理本地会话。

我有时需要在这些会话中使用 D-Bus,并且我想在这些登录会话中共享相同的 D-Bus 会话,以便使用 GVFS

推荐的方法是什么?我不想破坏我可能不知道的 D-Bus 的任何使用。我考虑过使用

export $(dbus-launch --autolaunch $(cat /var/lib/dbus/machine-id))
Run Code Online (Sandbox Code Playgroud)

但是(从 Ubuntu 12.04 开始)这似乎不对:

  • 这需要一个 X 会话,但我的 SSH 会话可能会或可能不会转发 X 显示,甚至那些没有相同的$DISPLAY
  • 如果没有可用的 X 显示,则dbus-launch抱怨“自动启动错误:X11 初始化失败”。并且不启动守护进程;
  • dbus-launch那个“男人页面状态--autolaunch的选项被认为是一个内部实现细节(...)。无论如何,没有真正的理由在 libdbus 实现之外使用它。”

dbus-launchD-Bus 套件中的其他工具是否支持自动检测运行dbus-daemon并连接到它?~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-${DISPLAY#*:}如果 D-Bus 是通过 X 连接启动的,则必要的信息在其中,但如果没有可用的 X 连接,则似乎不会存储在任何地方。

我应该拼凑自己的 D-Bus 会话文件吗?如果我这样做,我应该使用目录中的~/.dbus/session-bus文件吗?路径是否/var/lib/dbus/machine-id可靠且可移植?

ash*_*ash 6

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
Run Code Online (Sandbox Code Playgroud)

如果没有这个--autolaunch选项,我认为不需要 X windows 连接。