Wie konfiguriere ich D-Bus und SSH X-Forwarding, um zu verhindern, dass SSH beim Beenden hängen bleibt?

19

Ich versuche verschiedene Gnome-Anwendungen über X11 Forwarding und SSH auszuführen. Bei einigen Anwendungen wird zuerst die Anwendung 'dbus-launch' erzeugt. Das Problem ist, dass dbus-launch beim Beenden der X-Anwendung nicht geschlossen wird und daher beendet werden muss, bevor die SSH-Sitzung ordnungsgemäß geschlossen werden kann.

Ich gehe davon aus, dass das Problem darin besteht, dass die X / Gnome-Anwendungen keine Verbindung zum Hauptnachrichtenbus-Daemon herstellen können und daher eine eigene Kopie starten müssen. Wie kann ich das beheben? Oder was fehle ich?

Hier ist ein Beispiel. Ich habe die X11-Weiterleitung aktiviert, alles scheint gut zu funktionieren.

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

(hier wird das Programm gcalctool gestartet und auf meinem X-Server (Xming) angezeigt)

[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

(Jetzt nach dem Schließen der gcalctool-App in der Remote-Sitzung)

[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

Beachten Sie, dass dbus-launch noch aktiv ist. Und das Schlimmste ist, dass dies verhindert, dass die SSH-Verbindung ordnungsgemäß geschlossen wird, bis sie beendet wird.

Beachten Sie, dass der systemweite Nachrichtendämon ausgeführt wird, wie hier zu sehen ist:

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

Was vermisse ich hier? Ich habe dieses Verhalten noch nie gesehen. Vermutlich habe ich bisher nur Anwendungen gesehen, die sich ungehindert mit dem Message Bus Daemon verbinden können? Ich habe in / etc / dbus-1 nach Antworten gesucht, weiß aber nicht, wonach ich suchen soll.

Vielen Dank im Voraus für die Hilfe.

[BEARBEITEN]

OK, mir ist klar, dass ich ein allgemeines Problem habe. Es scheint, dass dies ein ziemlich verbreitetes Verhalten ist, aber ohne eine gute Lösung. Ich habe das SSH-Problem, weil der dbus-Start im tty noch aktiv ist. Aber es scheint keine gute Möglichkeit zu geben, den Start von dbus ruhig zu gestalten.

Ein Blick auf /etc/X11/xinit/xinitrc.d/00-start-message-bus.sh gibt einen Hinweis darauf, was mit einer "normalen" X-Sitzung passieren soll. Dies funktioniert natürlich nicht, wenn Sie eine X-Anwendung nur auf einem Remote-X-Server aufrufen.

Als vorübergehende Problemumgehung habe ich Folgendes zu meinem .bash_logout hinzugefügt:

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

Auf diese Weise kann die SSH-Sitzung geschlossen werden, fühlt sich jedoch klobig an. Gibt es da draußen bessere Lösungen? Was ist der richtige Weg, um entfernte X11-Anwendungen auszuführen, ohne dass dbus stört?

Taftster
quelle

Antworten:

15

Per dbus-Start (1):

Wenn DBUS_SESSION_BUS_ADDRESS für einen Prozess, der versucht, D-Bus zu verwenden, nicht festgelegt ist, versucht der Prozess standardmäßig, dbus-launch mit der Option --autolaunch aufzurufen, um einen neuen Sitzungsbus zu starten oder die vorhandene Busadresse auf der X-Anzeige zu suchen oder in einer Datei in ~ / .dbus / session-bus /

Bei jedem Autostart befindet sich die Anwendung, die einen neuen Bus starten musste, in einer eigenen kleinen Welt. Es kann effektiv dazu führen, dass eine ganz neue Sitzung gestartet wird, wenn versucht wird, viele Busdienste zu nutzen. Dies kann suboptimal oder sogar völlig kaputt sein, abhängig von der App und dem, was sie versucht.

Es gibt zwei häufige Gründe für den automatischen Start. Einer ist ssh zu einer entfernten Maschine.

Es scheint also der Trick zu sein, dbus-daemon präventiv so zu starten, dass Programme es finden können. Ich benutze:

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

das, abgesehen von gnome-terminal, dbus-daemon startet und $ DBUS_SESSION_BUS_ADDRESS innerhalb von gnome-terminal setzt .

Alle X-Programme, die von gnome-terminal ausgeführt werden, verhalten sich dann gut, und dbus-launch räumt nach dem Beenden von gnome-terminal auf.

Nathan
quelle
Ich habe dies als Antwort markiert. Ich mag Ihre Lösung hier. Vielen Dank. Das Starten eines Gnome-Terminals und das anschließende Starten zusätzlicher Programme scheint mein Problem zu beheben. Ist das aber ein neues Verhalten? Ich erinnere mich anscheinend, dass ich viele X-weitergeleitete Fenster ohne dieses Problem starten konnte. Vielleicht verwenden neuere Gnome-Programme jetzt Dbus, also habe ich das noch nicht gesehen?
Taftster
2

Ich frage mich, ob das Problem nicht auf eine unbekannte oder unaufhaltsame dbus-Sitzung zurückzuführen ist.

Wenn eine SSH-Sitzung geöffnet ist, wird keine dbus-Sitzung gestartet. Einige Programme starten es möglicherweise, aber die Sitzung weiß nichts davon (kann es daher nicht schließen).

Wenn Sie nichts über die dbus-Sitzung wissen, bedeutet dies auch, dass Programme, die dbus verwenden, aber nicht selbst starten, Probleme haben.

dbus-Abschnitte sind pro Maschine und pro X11-Display. Ihre Informationen werden in $ HOME / .dbus / session-bus / gespeichert. Der dort angegebene Prozess kann jedoch geschlossen werden. Daher ist eine zusätzliche Überprüfung erforderlich, um festzustellen, ob der Start von dbus erforderlich ist oder nicht. Anschließend werden die dortigen Variablen in die Sitzung exportiert.

Dann funktioniert es wie ein Zauber :)

Ich füge Folgendes in meine .bash_profile-Datei ein:

# 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

Anmerkungen: hostnamectl ist Teil von systemd und ermöglicht das Abrufen der Rechner-ID. Der dbus-Start zeigt die gewünschten Variablen an. Mit Hilfe export $(dbus-launch)von rufen wir die Ausgabe von dbus-launch ab und exportieren die Variablen

Wenn Sie möchten, dass es auf einer nicht interaktiven Sitzung ausgeführt wird (z. B. wenn Sie einen Befehl von ssh ausführen), versuchen Sie es stattdessen in .bashrc (achten Sie jedoch darauf, dass bashrc bei JEDER geöffneten Shell ausgeführt wird).

Pablo Saratxaga
quelle
1

Ich hatte das gleiche Problem beim Versuch, einen Remote-X-Befehl auszuführen und die Sitzung zu beenden, nachdem das X-Tool beendet wurde.

Also wollte ich rennen

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

Musste aber benutzen:

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

Nach dem Schließen von Firefox würde dies auch die SSH-Sitzung schließen.

Update :

Dies scheint eine Last von Dbus-Daemon-Prozessen zu hinterlassen, die auf dem Server ausgeführt werden. Dies ist also nicht optimal. Das Hinzufügen von --exit-with-session für beide Konten hilft nicht, da hierdurch das ursprüngliche Verhalten wiederhergestellt wird

Update 2 : Dies funktioniert, wenn ich einfache Anführungszeichen verwende (wie von @lobo vorgeschlagen) und kill -TERM $DBUS_SESSION_BUS_PIDdie verbleibenden dbus-daemon-Prozesse hinzufüge , wie von Holgr Joukl unter https://blog.dhampir.no/content/how- vorgeschlagen. zu verhindern , -SSH-x-from-hanging-on-exit-when-dbus-is-verwendet )

Jens Timmerman
quelle
Sie müssen im letzten Befehl einfache Anführungszeichen verwenden (ansonsten dbus-launchwird es lokal ausgeführt ), aber dann funktioniert es. Vielen Dank!
l0b0