我试图通过X11转发和SSH运行各种Gnome应用程序。 有些应用程序会导致“dbus-launch”应用程序首先被激活。 问题在于退出X应用程序后,dbus-launch不会closures,因此必须在SSH会话closures之前终止。
我假设问题是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
(现在,在closures远程会话中的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连接在被终止之前正常closures。
请注意,系统信息守护进程正在运行,如下所示:
[me@host ~]$ ps ax 4696 ? Ssl 0:00 dbus-daemon --system
我在这里错过了什么? 我从来没有见过这种行为。 据推测,我只见过可以连接到消息总线守护进程的应用程序吗? 我已经在/ etc / dbus-1中寻找答案,但不知道要寻找什么。
先谢谢您的帮助。
[编辑]
好的,我正在意识到我遇到了一个共同的问题。 看来这是一个相当普遍的行为,但没有一个好的解决scheme。 我正遇到SSH挂起,因为dbus-launch在tty中仍处于活动状态。 但是看起来没有什么好方法让dbus发射悄然发生。
看看/etc/X11/xinit/xinitrc.d/00-start-message-bus.sh给出了一些关于“正常”X会话应该发生什么的线索。 当调用X应用程序到远程X服务器时,这当然不起作用。
作为一个临时的解决方法,我已经添加到我的.bash_logout:
# ~/.bash_logout pkill -u $USER -t `tty | cut -d '/' -f 3,4` dbus-launch
这将允许SSH会话closures,但感觉很糟糕。 那里有更好的解决scheme吗? 运行远程X11应用程序的正确方法是什么?
每个dbus-launch(1):
如果DBUS_SESSION_BUS_ADDRESS未设置为尝试使用D-Bus的进程,默认情况下,进程将尝试使用–autolaunch选项调用dbus-launch以启动新的会话总线或在X显示器上查找现有的总线地址或者在〜/ .dbus / session-bus /
每当发生自动启动时,必须启动新的公共汽车的应用程序将在其自己的小世界中; 如果试图使用大量的公共汽车服务,它可能会有效地开始一个新的会话。 这可能是不理想的,甚至完全破坏,取决于应用程序和它试图做什么。
自动启动有两个常见的原因。 一个是ssh到远程机器。
所以看起来诀窍就是预先启动dbus-daemon,以便程序可以find它。 我用:
[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会自行清理。
我想知道这个问题是不是因为一个未知的或者不确定的dbus会话而出现的。
事实上,当SSH会话打开时,它不会启动一个dbus会话。 一些程序可能启动它,但是然后会话不知道它(因此不能closures它)。
不知道dbus会话也意味着程序thzat使用dbus,但不自己启动会有问题。
dbus部分是每台机器和每个X11显示器。 他们的信息存储在$ HOME / .dbus / session-bus /中,然而,这里引用的过程可能是closures的,所以需要额外的检查来确定是否需要启动dbus。 然后,这些variables将被导出到会话中。
然后它就像一个魅力:)
我把以下放在我的.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的一部分,并允许检索机器ID,dbus-launch显示我们想要的variables; 通过使用export $(dbus-launch)我们检索dbus-launch的输出并导出variables
如果你想在非交互式sessio上完成(比如从ssh运行一个命令的时候),可以尝试把它放在.bashrc中(但是要注意在EVEERY打开的shell中执行bashrc)
试图运行远程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'
closuresFirefox后,这也将closuresSSH会话。
更新 :
这似乎是在服务器上运行的dbus守护进程的负载,所以这不是最佳的,在这两个帐户上添加–exit-with-session不会有帮助,因为这会恢复原来的行为
更新2 :当我使用单引号(如@lobobuild议的)并添加kill -TERM $DBUS_SESSION_BUS_PID来杀死剩余的dbus-daemon进程时,这可行,如Holgr Joukl从https://blog.dhampir.no / content / how-to-prevent-ssh-x-from-hanging-on-exit-when-dbus-is-used )