Bagaimana cara mengkonfigurasi D-Bus dan SSH X-Forwarding untuk mencegah SSH menggantung saat keluar?

19

Saya mencoba menjalankan berbagai aplikasi Gnome melalui X11 Forwarding dan SSH. Beberapa aplikasi akan menyebabkan aplikasi 'dbus-launch' muncul pertama kali. Masalahnya adalah bahwa peluncuran dbus tidak menutup ketika aplikasi X keluar, dan karena itu harus dibunuh sebelum sesi SSH dapat ditutup dengan benar.

Saya berasumsi masalahnya adalah bahwa aplikasi X / Gnome tidak dapat terhubung dengan daemon bus pesan utama dan karena itu harus meluncurkan salinannya sendiri? Bagaimana saya bisa memperbaikinya? Atau apa yang saya lewatkan?

Berikut ini sebuah contoh. Saya telah mengaktifkan X11 Forwarding, semua sepertinya berfungsi dengan baik.

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

(di sini program gcalctool diluncurkan dan ditampilkan ke server X saya hapus (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

(sekarang, setelah menutup aplikasi gcalctool di sesi jarak jauh)

[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

Perhatikan bahwa peluncuran dbus masih aktif. Dan bagian terburuknya, ini mencegah koneksi SSH dari menutup dengan benar sampai terbunuh.

Perhatikan bahwa daemon pesan lebar sistem sedang berjalan, seperti yang dapat dilihat di sini:

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

Apa yang kulewatkan di sini? Saya belum pernah melihat perilaku ini sebelumnya. Agaknya, saya hanya pernah melihat aplikasi yang dapat terhubung ke daemon bus pesan tanpa hambatan? Saya telah mencari di / etc / dbus-1 untuk jawaban, tetapi tidak tahu harus mencari apa.

Terima kasih sebelumnya atas bantuannya.

[EDIT]

Oke, saya menyadari bahwa saya mengalami masalah yang sama. Sepertinya ini adalah perilaku yang cukup umum, tetapi tanpa solusi yang baik. Saya mengalami hang SSH karena dbus-launch masih aktif di tty. Tapi sepertinya tidak ada cara yang baik untuk membuat peluncuran dbus terjadi dengan tenang.

Melihat /etc/X11/xinit/xinitrc.d/00-start-message-bus.sh memberikan beberapa petunjuk tentang apa yang seharusnya terjadi dengan sesi X "normal". Ini tentu saja tidak berfungsi ketika hanya menjalankan aplikasi X ke server X jarak jauh.

Sebagai solusi sementara, saya telah menambahkan ini ke .bash_logout saya:

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

Ini akan memungkinkan sesi SSH untuk menutup, tetapi rasanya kumal. Apakah ada solusi yang lebih baik di luar sana? Apa cara yang tepat untuk menjalankan aplikasi X11 jarak jauh tanpa dbus menghalangi?

taftster
sumber

Jawaban:

15

Per dbus-launch (1):

Jika DBUS_SESSION_BUS_ADDRESS tidak diatur untuk proses yang mencoba menggunakan D-Bus, secara default proses akan mencoba untuk memanggil peluncuran-dbus dengan opsi --autolaunch untuk memulai bus sesi baru atau menemukan alamat bus yang ada di layar X atau dalam file di ~ / .dbus / session-bus /

Setiap kali terjadi pelambatan otomatis, aplikasi yang harus memulai bus baru akan berada di dunianya sendiri; itu secara efektif dapat memulai sesi baru jika mencoba menggunakan banyak layanan bus. Ini bisa suboptimal atau bahkan benar-benar rusak, tergantung pada aplikasi dan apa yang coba dilakukan.

Ada dua alasan umum untuk pelambatan otomatis. Salah satunya adalah ssh ke mesin jarak jauh.

Jadi sepertinya triknya adalah memulai dbus-daemon terlebih dahulu, sedemikian rupa sehingga program dapat menemukannya. Saya menggunakan:

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

yang, selain dari terminal gnome, memulai dbus-daemon dan menetapkan $ DBUS_SESSION_BUS_ADDRESS di dalam terminal gnome .

Setiap program X dijalankan dari gnome-terminal kemudian berperilaku baik, dan peluncuran dbus membersihkan setelah itu sendiri ketika gnome-terminal keluar.

Nathan
sumber
Saya menandai ini sebagai jawabannya, saya suka solusi Anda di sini. Terima kasih. Meluncurkan terminal gnome terlebih dahulu, dan kemudian meluncurkan program tambahan sepertinya memperbaiki masalah saya. Apakah ini perilaku baru? Sepertinya saya ingat bisa meluncurkan banyak windows X yang diteruskan tanpa mengalami masalah ini. Mungkin program Gnome yang lebih baru menggunakan Dbus sekarang, jadi saya belum melihat ini?
taftster
2

Saya ingin tahu apakah masalahnya tidak terjadi karena sesi dbus yang tidak diketahui atau tidak aktif.

Memang ketika sesi SSH terbuka, itu tidak meluncurkan sesi dbus. Beberapa program mungkin meluncurkannya, tetapi kemudian sesi tidak mengetahuinya (karenanya tidak dapat menutupnya).

Tidak mengetahui tentang sesi dbus juga berarti bahwa program yang menggunakan dbus tetapi tidak meluncurkannya sendiri akan memiliki masalah.

bagian dbus adalah per mesin dan per tampilan X11. Info mereka disimpan dalam $ HOME / .dbus / session-bus / - namun, proses yang dirujuk di sana mungkin ditutup, sehingga diperlukan pemeriksaan tambahan untuk menentukan apakah meluncurkan dbus diperlukan atau tidak. Kemudian, variabel yang ada untuk diekspor ke sesi.

Maka itu bekerja seperti pesona :)

Saya menaruh yang berikut ini di file .bash_profile saya:

# 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

Catatan: hostnamectl adalah bagian dari systemd dan memungkinkan untuk mengambil mesin-id dbus-launch menampilkan variabel yang kita inginkan; dengan menggunakan export $(dbus-launch)kami mengambil output dari peluncuran -bus dan mengekspor variabel

jika Anda ingin itu dilakukan pada sessio non-interaktif (misalnya ketika menjalankan perintah dari ssh) cobalah memasukkannya di.

Pablo Saratxaga
sumber
1

Saya memiliki masalah yang sama ketika mencoba menjalankan perintah X jarak jauh, dan membuat sesi keluar setelah alat X keluar.

Jadi saya ingin lari

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

Tetapi harus menggunakan:

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

Setelah menutup firefox, ini juga akan menutup sesi ssh.

Perbarui :

Ini sepertinya membiarkan banyak proses dbus-daemon berjalan di server, jadi ini tidak optimal, menambahkan --exit-dengan-sesi pada kedua akun tidak membantu, karena ini mengembalikan perilaku asli

pembaruan 2 : ini berfungsi ketika saya menggunakan tanda kutip tunggal, (seperti yang disarankan oleh @lobo) dan menambahkan kill -TERM $DBUS_SESSION_BUS_PIDuntuk membunuh proses dbus-daemon yang tersisa, seperti yang diusulkan oleh Holgr Joukl dari https://blog.dhampir.no/content/how- untuk-mencegah-ssh-x-dari-menggantung-saat-keluar-saat-dbus-digunakan )

Jens Timmerman
sumber
Anda harus menggunakan tanda kutip tunggal pada perintah terakhir (jika dbus-launchtidak dijalankan secara lokal ), tetapi kemudian berhasil. Terima kasih!
l0b0