如何配置D-Bus和SSH X-Forwarding以防止SSH在退出时挂起?


19

我正在尝试通过X11转发和SSH运行各种Gnome应用程序。某些应用程序将导致首先生成“ dbus-launch”应用程序。问题是退出X应用程序时dbus-launch不会关闭,因此必须先将其杀死,然后才能正确关闭SSH会话。

我认为问题是X / Gnome应用程序无法与主消息总线守护程序连接,因此必须启动它们自己的副本?我怎样才能解决这个问题?还是我想念什么?

这是一个例子。我启用了X11转发,一切似乎工作正常。

[me@host ~]$ gnome-calculator &
[1] 4803

(这里gcalctool程序启动,并显示在我的删除X服务器(Xming)中)

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4803 pts/0    00:00:00 gnome-calculator
 4807 pts/0    00:00:00 dbus-launch
 4870 pts/0    00:00:00 ps

(现在,在远程会话中关闭gcalctool应用后)

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4807 pts/0    00:00:00 dbus-launch
 4898 pts/0    00:00:00 ps

请注意,dbus-launch仍处于活动状态。最糟糕的是,这会阻止SSH连接正常关闭,直到被终止。

请注意,系统范围的消息守护程序正在运行,如此处所示:

[me@host ~]$ ps ax
 4696 ?     Ssl   0:00 dbus-daemon --system

我在这里想念什么?我从未见过这种行为。大概,我只见过可以不受阻碍地连接到消息总线守护程序的应用程序吗?我已经在/ etc / dbus-1中寻找了答案,但是不知道要寻找什么。

先谢谢您的帮助。

[编辑]

好的,我意识到自己遇到了一个常见问题。看来这是相当普遍的行为,但是没有好的解决方案。我正在SSH挂起,因为tty中的dbus-launch仍处于活动状态。但是似乎没有什么好方法可以使dbus的发布悄然发生。

查看/etc/X11/xinit/xinitrc.d/00-start-message-bus.sh会提供一些有关“正常” X会话应该发生的情况的线索。当仅将X应用程序调用到远程X Server时,这当然是行不通的。

作为临时的解决方法,我已将其添加到我的.bash_logout中:

# ~/.bash_logout
pkill -u $USER -t `tty | cut -d '/' -f 3,4` dbus-launch

这将允许SSH会话关闭,但是感觉很混乱。有没有更好的解决方案?在没有dbus妨碍的情况下运行远程X11应用程序的正确方法是什么?

Answers:


15

每dbus启动(1):

如果未为尝试使用D-Bus的进程设置DBUS_SESSION_BUS_ADDRESS,则默认情况下,该进程将尝试使用--autolaunch选项调用dbus-launch,以启动新的会话总线或在X显示屏上找到现有的总线地址。或〜/ .dbus / session-bus /中的文件中

每当发生自动启动时,必须启动新总线的应用程序便会处于自己的小世界中。如果尝试使用大量总线服务,它可以有效地结束一个全新的会话。根据应用程序及其尝试执行的操作,此操作可能不是最理想的,甚至可能是完全无效的。

自动启动有两个常见原因。一个是SSH到远程计算机。

因此,似乎诀窍是抢先启动dbus-daemon,以使程序可以找到它。我用:

[me@host ~]$ dbus-launch --exit-with-session gnome-terminal

除了gnome-terminal之外,它还会启动dbus-daemon并在gnome-terminal内设置$ DBUS_SESSION_BUS_ADDRESS 。

任何从gnome-terminal运行的X程序都表现良好,并且当gnome-terminal退出时,dbus-launch会自行清除。


我将其标记为答案,在这里我喜欢您的解决方案。谢谢。首先启动gnome终端,然后从中启动其他程序似乎可以解决我的问题。这是新行为吗?我似乎还记得能够启动许多X转发的窗口而不会出现此问题。也许新的Gnome程序现在正在使用Dbus,所以我还没看到呢?
taftster

2

我想知道是否由于未知或不存在的dbus会话而出现问题。

实际上,当SSH会话打开时,它不会启动dbus会话。某些程序可能会启动它,但随后会话不知道它(因此无法关闭它)。

不了解dbus会话还意味着该程序使用dbus但不自行启动它会遇到问题。

dbus部分是按机器和X11显示的。它们的信息存储在$ HOME / .dbus / session-bus /中,但是,那里引用的进程可能已关闭,因此需要额外检查以确定是否需要启动dbus。然后,将那里的变量误导出到会话中。

然后它就像一个魅力:)

我将以下内容放入我的.bash_profile文件中:

# set dbus for remote SSH connections
if [ -n "$SSH_CLIENT" -a -n "$DISPLAY" ]; then
    machine_id=$(LANGUAGE=C hostnamectl|grep 'Machine ID:'| sed 's/^.*: //')
    x_display=$(echo $DISPLAY|sed 's/^.*:\([0-9]\+\)\(\.[0-9]\+\)*$/\1/')
    dbus_session_file="$HOME/.dbus/session-bus/${machine_id}-${x_display}"
    if [ -r "$dbus_session_file" ]; then
            export $(grep '^DBUS.*=' "$dbus_session_file")
            # check if PID still running, if not launch dbus
            ps $DBUS_SESSION_BUS_PID | tail -1 | grep dbus-daemon >& /dev/null
            [ "$?" != "0" ] && export $(dbus-launch) >& /dev/null
    else
            export $(dbus-launch) >& /dev/null
    fi
fi

注意:hostnamectl是systemd的一部分,并允许检索dbus-launch显示所需变量的机器ID。通过使用export $(dbus-launch)我们检索dbus-launch的输出并导出变量

如果您希望在非交互式sessio上完成此操作(例如,从ssh运行命令时),请尝试将其放入.bashrc中(但请注意,bashrc是在EVEERY打开的shell上执行的)


1

尝试运行远程X命令并退出X工具后退出会话时,我遇到了同样的问题。

所以我想跑步

ssh -X user@remotehost "firefox -no-remote"

但是不得不使用:

ssh -X user@remotehost 'export \`dbus-launch\`; dbus-launch firefox -no-remote; kill -TERM $DBUS_SESSION_BUS_PID'

关闭Firefox之后,这也将关闭ssh会话。

更新

这似乎使服务器上运行着许多dbus-daemon进程,因此这不是最佳选择,在两个帐户上添加--exit-with-session都无济于事,因为这会还原原始行为

更新2:当我使用单引号(如@lobo所建议)并添加kill -TERM $DBUS_SESSION_BUS_PID以杀死剩余的dbus-daemon进程(如Holgr Jouklhttps://blog.dhampir.no/content/how-防止在使用dbus时从出口挂起ssh x


您必须在最后一个命令中使用单引号(否则dbus-launch将在本地运行),但随后它可以工作。谢谢!
13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.