終了時にSSHがハングしないようにD-BusとSSH X-Forwardingを構成する方法


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で答えを探しましたが、何を探すべきかわかりません。

助けてくれてありがとう。

[編集]

OK、私は共通の問題を経験していることに気づいています。これはかなり一般的な動作のようですが、良い解決策はありません。ttyでdbus-launchがまだアクティブであるため、SSHハングが発生しています。しかし、dbus-launchを静かに実行する良い方法はないようです。

/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セッションを終了できますが、気分が悪くなります。より良い解決策はありますか?dbusが邪魔することなくリモートX11アプリケーションを実行する適切な方法は何ですか?

回答:


15

dbus-launch(1)ごと:

D-Busを使用しようとするプロセスにDBUS_SESSION_BUS_ADDRESSが設定されていない場合、デフォルトでは、プロセスは--autolaunchオプションを指定してdbus-launchを呼び出し、新しいセッションバスを起動するか、Xディスプレイで既存のバスアドレスを見つけようとしますまたは〜/ .dbus / session-bus /のファイル内

自動起動が発生するたびに、新しいバスを開始する必要があったアプリケーションは、独自の小さな世界になります。多くのバスサービスを使用しようとすると、まったく新しいセッションを開始することになります。これは、アプリとアプリが何をしようとしているかによって、最適ではないか、完全に壊れることさえあります。

自動起動には2つの一般的な理由があります。1つは、リモートマシンへのsshです。

だから、トリックはプログラムがそれを見つけることができるような方法で、先制的にdbus-daemonを開始することであるようです。私が使う:

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

これは、gnome-terminalとは別に、dbus-daemonを起動し、gnome-terminal内で $ DBUS_SESSION_BUS_ADDRESSを設定します。

Xプログラムはgnome-terminalから実行され、その後正常に動作し、gnus-terminalが終了するとdbus-launchは自動的にクリーンアップします。


私はこれを答えとしてマークしました、ここであなたの解決策が好きです。ありがとうございました。最初にgnome-terminalを起動し、次にそこから追加のプログラムを起動すると、私の問題が解決したようです。しかし、これは新しい動作ですか?この問題がなくても、多くのX転送ウィンドウを起動できたことを覚えているようです。新しいGnomeプログラムがDbusを使用しているのかもしれないので、私はまだこれを見ていませんか?
タフスター

2

dbusセッションが不明または終了していないために、問題が発生しないのではないかと思います。

実際、SSHセッションが開いている場合、dbusセッションは起動しません。いくつかのプログラムはそれを起動するかもしれませんが、それからセッションはそれについて知りません(それゆえそれを閉じることができません)。

また、dbusセッションについて知らないということは、プログラムthzatが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が必要な変数を表示するmachine-idを取得できます。を使用しexport $(dbus-launch)て、dbus-launchの出力を取得し、変数をエクスポートします

非対話型のsessioで実行したい場合(たとえば、sshからコマンドを実行する場合)、代わりに.bashrcに入れてみてください(ただし、bashrcはEVEERYで開かれたシェルで実行されることに注意してください)


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が示唆するように)単一引用符を使用し、https://blog.dhampir.no/content/how-からHolgr Jouklがkill -TERM $DBUS_SESSION_BUS_PID提案したように、残りのdbus-daemonプロセスを強制終了するときに機能ます。 to-prevent-ssh-x-from-hanging-on-exit-when-dbus-is-used


最後のコマンドで一重引用符を使用する必要があります(それ以外の場合dbus-launchローカルで実行されます)が、その後は機能します。ありがとう!
l0b0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.