Solusi 1:
Per dbus-launch(1):
Jika DBUS_SESSION_BUS_ADDRESS tidak disetel untuk proses yang mencoba menggunakan D-Bus, secara default proses akan mencoba memanggil peluncuran-dbus dengan opsi --autolaunch untuk memulai bus sesi baru atau menemukan alamat bus yang ada di tampilan X atau dalam file di ~/.dbus/session-bus/
Setiap kali peluncuran otomatis terjadi, aplikasi yang harus memulai bus baru akan berada di dunianya sendiri; itu dapat secara efektif memulai sesi baru jika mencoba menggunakan banyak layanan bus. Ini bisa menjadi kurang optimal atau bahkan rusak total, bergantung pada aplikasi dan apa yang coba dilakukannya.
Ada dua alasan umum untuk peluncuran 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:
[[email protected] ~]$ dbus-launch --exit-with-session gnome-terminal
yang, selain dari gnome-terminal, memulai dbus-daemon dan menyetel $DBUS_SESSION_BUS_ADDRESS di dalam gnome-terminal .
Program X apa pun dijalankan dari gnome-terminal lalu berperilaku baik, dan dbus-launch membersihkan dirinya sendiri saat gnome-terminal keluar.
Solusi 2:
Saya bertanya-tanya apakah masalahnya bukan karena sesi dbus yang tidak diketahui atau keluar.
Memang ketika sesi SSH terbuka, itu tidak meluncurkan sesi dbus. Beberapa program mungkin meluncurkannya, tetapi kemudian sesi tidak mengetahuinya (sehingga tidak dapat menutupnya).
Tidak mengetahui tentang sesi dbus juga berarti program yang menggunakan dbus tetapi tidak meluncurkannya sendiri akan mengalami masalah.
bagian dbus adalah per mesin dan per tampilan X11. Infonya disimpan di $HOME/.dbus/session-bus/-namun, proses yang direferensikan di sana mungkin ditutup, sehingga diperlukan pemeriksaan tambahan untuk menentukan apakah meluncurkan dbus diperlukan atau not.Kemudian, variabel yang ada akan diekspor ke sesi.
Maka itu berfungsi seperti pesona :)
Saya meletakkan 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-idthe dbus-launch menampilkan variabel yang kita inginkan; dengan menggunakan export $(dbus-launch)
kami mengambil output dari dbus-launch dan mengekspor variabel
jika Anda ingin itu dilakukan pada sesi non-interaktif (misalnya saat menjalankan perintah dari ssh) coba masukkan .bashrc sebagai gantinya (tetapi berhati-hatilah karena bashrc dijalankan di SETIAP shell terbuka)
Solusi 3:
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 [email protected] "firefox -no-remote"
Tetapi harus menggunakan:
ssh -X [email protected] 'export \`dbus-launch\`; dbus-launch firefox -no-remote; kill -TERM $DBUS_SESSION_BUS_PID'
Setelah menutup firefox, ini juga akan menutup sesi ssh.
Perbarui :
Hal ini tampaknya meninggalkan banyak proses dbus-daemon yang berjalan di server, jadi ini tidak optimal, menambahkan --exit-with-session pada kedua akun tidak membantu, karena ini mengembalikan perilaku asli
perbarui 2 :ini berfungsi ketika saya menggunakan tanda kutip tunggal, (seperti yang disarankan oleh @lobo) dan menambahkan kill -TERM $DBUS_SESSION_BUS_PID
untuk mematikan proses dbus-daemon yang tersisa, seperti yang diusulkan oleh Holgr Joukl dari https://blog.dhampir.no/content/how-to-prevent-ssh-x-from-hanging-on-exit-when-dbus-is -digunakan)