SSH가 종료에 걸리지 않도록 D-Bus 및 SSH X-Forwarding을 구성하는 방법은 무엇입니까?


19

X11 Forwarding 및 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 연결이 끊길 때까지 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 실행 당 (1) :

D-Bus를 사용하려는 프로세스에 대해 DBUS_SESSION_BUS_ADDRESS가 설정되지 않은 경우 기본적으로 프로세스는 --autolaunch 옵션으로 dbus-launch를 호출하여 새 세션 버스를 시작하거나 X 디스플레이에서 기존 버스 주소를 찾습니다. 또는 ~ / .dbus / session-bus /의 파일에

자동 실행이 발생할 때마다 새 버스를 시작해야하는 응용 프로그램은 작은 세계에있게됩니다. 많은 버스 서비스를 사용하려고하면 완전히 새로운 세션을 시작하게됩니다. 앱과 수행하려는 작업에 따라 차선책이거나 완전히 깨질 수 있습니다.

자동 실행에는 두 가지 일반적인 이유가 있습니다. 하나는 원격 시스템에 ssh입니다.

따라서 트릭은 프로그램이 찾을 수있는 방식으로 dbus-daemon을 선제 적으로 시작하는 것 같습니다. 나는 사용한다:

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

gnome-terminal 외에도 dbus-daemon을 시작하고 gnome-terminal 내에서 $ DBUS_SESSION_BUS_ADDRESS를 설정합니다 .

그놈 터미널에서 실행되는 모든 X 프로그램은 훌륭하게 작동하며, 그놈 터미널이 종료되면 dbus-launch가 자체적으로 정리됩니다.


나는 이것을 대답으로 표시했다. 나는 당신의 해결책을 좋아한다. 감사합니다. 그놈 터미널을 먼저 시작한 다음 추가 프로그램을 시작하면 문제가 해결되는 것 같습니다. 그래도이 새로운 행동입니까? 이 문제없이 많은 X 전달 창을 시작할 수 있었던 것으로 보입니다. 어쩌면 최신 Gnome 프로그램이 Dbus를 사용하고 있기 때문에 아직 보지 못했습니까?
taftster

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의 일부이며 시스템 ID를 검색 할 수 있습니다. dbus-launch는 원하는 변수를 표시합니다. 를 사용하여 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'

파이어 폭스를 닫으면 ssh 세션도 닫힙니다.

업데이트 :

이것은 서버에서 실행중인 dbus-daemon 프로세스를 많이 남겨 두는 것처럼 보이므로 최적이 아니므로 두 계정에 --exit-with-session을 추가해도 도움이되지 않습니다. 원래 동작을 되돌리기 때문입니다.

업데이트 2 : @lobo가 제안한 작은 따옴표를 사용 하고 https://blog.dhampir.no/content/how- 에서 Holgr Joukl이kill -TERM $DBUS_SESSION_BUS_PID 제안한대로 남은 dbus 데몬 프로세스를 죽이려면 추가 할 때 작동합니다. dbus가 사용될 때 ssh-x에서 hanging-on-exit를 방지 )


마지막 명령에 작은 따옴표 를 사용해야 하지만 그렇지 않으면 로컬로dbus-launch 실행 됩니다 . 감사!
l0b0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.