openSUSE Leap 42.2 그놈 터미널 3.20.2
터미널 창을 열었습니다. 다음 명령을 입력하면:
gnome-terminal
루트가 아닌 사용자로서 새 터미널을 성공적으로 시작했습니다.
그러나 루트로 명령을 실행하면 다음과 같은 오류 메시지가 나타납니다.
org.gnome.Terminal용 에이전트 구축 중 오류 발생: /org/gnome/Terminal/Factory0: 연결이 닫혔습니다.
터미널을 시작하려고 하면 dbus-launch gnome-terminal
작동합니다.
gnome-terminal
명령이 터미널을 루트로 시작하지 못하게 하는 이유는 무엇입니까 ? 허용 가능한 해결 방법 입니까 dbus-launch
, 아니면 예상치 못한 문제를 일으킬 수 있습니까(무슨 일인지 잘 모르겠습니다).
답변1
Win32가 등장하고 이를 없애기 전 Win16일을 기억해 보세요. Windows 응용 프로그램이 주로 어떻게 작동했는지 기억해 보십시오 hInstance
. hPrevInstance
명령 스크립트 도구(예: Take Command)를 사용하면 응용 프로그램을 두 번째로 호출하고 화면에 분명히 추가된 창으로 표시되지만 명령 해석기에 관한 한 방금 실행한 하위 프로세스가 즉시 종료됩니까?
GNOME은 Linux용 Win16 동작을 복원합니다.
그놈 터미널은 이제 클라이언트-서버 응용 프로그램입니다. 이 gnome-terminal
프로그램은 데스크톱 버스 메시지를 서버에 구성하고 명령줄 옵션, 환경, 작업 디렉터리 및 매개변수를 전달한 다음 간단히 종료하는 클라이언트일 뿐입니다. 서버는 데스크탑 버스에 gnome-terminal-server
등록되어 org.gnome.Terminal
있으며 모든 실제 터미널 에뮬레이션과 GUI에 창 표시를 담당합니다.
데스크톱 버스 클라이언트는 gnome-terminal
일반적으로 사용자별 디렉터리의 소켓을 가리키는 환경 변수를 통해 데스크톱 버스 에이전트를 찾습니다. /run/user/1001
예를 들어, 환경 변수는 "현재 사용자의 런타임 디렉터리"에서 검색되도록 지정합니다. 클라이언트 프로세스의 유효 사용자 ID는 위에서 설명한 것과 유사한 경로를 구성합니다. 두 경우 모두 디렉터리는 일반적으로 개별 사용자에게만 공개되며 다른(권한이 없는) 사용자는 액세스할 수 없습니다.
사람들이 이런 일을 통해 다른 사용자로 실행하려고 하면 gnome-terminal
재미있는 일이 발생합니다 . sudo
환경 변수가 명시적으로 명명된 런타임 디렉터리를 가리키는 경우 권한이 없는 클라이언트는 사용자별 데스크톱 버스에 연결할 수 없습니다. 환경 변수가 "현재 사용자의" 런타임 디렉터리를 가리키는 경우 잘못된 Desktop Bus 에이전트(일반적으로 해당 사용자의 에이전트)를 찾습니다.지금은 아무것도 없다사용자가 아직 로그인하지 않았고 해당 사용자 계정에 대한 사용자별 서비스를 시작하지 않았기 때문에 Desktop Bus 에이전트가 실행 중입니다. (사용자별 데스크탑 버스 에이전트는 사용자별 서비스 관리자에 의해 실행됩니다. 사용자별 서비스 관리자는 명시적으로 시작되거나 일부 서비스 관리 소프트웨어의 경우 서버에 대한 다소 추악한 후크를 통해 시작됩니다 login
. su
및 SSH 서버 프로그램 등)
dbus-launch
슈퍼유저가 되는 이유는 dbus-launch
명시적으로 다른 데스크탑 버스 에이전트를 시작하고 이를 슈퍼유저로 실행하여 gnome-terminal
통신할 수 있었기 때문입니다. 다행스럽게도 시스템은 gnome-terminal-server
클라이언트가 프록시를 통해 서버에 연결을 시도할 때 서버 시작을 요청하도록 구성되어 있습니다. (반드시 그런 것은 아니며 이러한 종류의 수요 시작은 어떤 종류의 서비스 관리에서도 실행되지 않는 많은 수의 데스크톱 버스 서버 프로세스로 끝나기 때문에 이제 좋지 않은 메커니즘으로 간주됩니다. 서비스 관리 하에 있는 에이전트 자체를 다운시키는 것도 열등한 것으로 간주되며 일반적으로 좋은 생각으로 간주되지 않습니다.뿌리이러한 서비스 중 다수는 일반 사용자 계정으로 실행하기를 원하기 때문에 슈퍼유저 권한으로 실행하기를 원하지 않기 때문에 이러한 서비스를 실행하기 위한 계정입니다. )
질문자님 말씀대로라면 "헤드리스 서버에서 원격으로 gnome-terminal을 시작하는 방법은 무엇입니까? (X11 전달을 통해 시작할 수 없습니다)gnome-terminal
"실제로 사람들은 원래 사용자가 Desktop Bus 에이전트를 실행하지 않더라도 Desktop Bus 에이전트를 실행하려고 시도할 것입니다. 예를 들어 사용자가 SSH를 통해 로그인했지만 SSH 로그인 프로세스가 사용자별 서비스 관리자를 시작하지 않는 경우에 이런 일이 발생합니다. 이는 사용자별 데스크톱 버스 에이전트가 실행되고 있지 않으며 gnome-terminal-server
데스크톱 버스를 통해 서버에 액세스할 수 없음을 의미합니다(시스템 구성 방법에 따라 그래픽 로그인으로 인해 사용자별 서비스 관리자가 계속 실행될 수 있음). 결과적으로 동일한 사용자의 그래픽 로그인이 마법처럼 작동하게 되고 dbus-launch
서비스 관리되지 않는 데스크탑 버스 에이전트가 명시적으로 다시 시작된다는 것을 알 수 있습니다.
login
그러나 서비스 관리자 중 한 명이 서버에 연결 하고 SSH를 통해 서버에 접속할 수 있으면 su
더 많은 웃음이 나옵니다 . 이러한 후크는 일반적으로 해당 사용자가 처음 로그인할 때 시작되는 사용자별 서비스 관리 및 모든 사용자별 서비스를 시작하고 해당 사용자가 최종적으로 로그아웃할 때 모든 서비스를 중지하는 의미를 구현합니다. 단기적이고 겹치지 않는 SSH 세션이 많은 경우 작업 시작과 끝에서 전체 사용자별 서비스 관리 시스템(및 자동으로 시작되는 모든 서비스)을 시작하고 종료하는 데 상당한 오버헤드가 발생할 수 있습니다. 각 SSH 세션. systemd는 "호버링" 메커니즘이 완벽하지 않고 실제로 문제의 절반만 해결하는 서비스 관리자 중 하나입니다. 이는 최종 로그아웃 이후에 사용자별 서비스 관리가 "멈추지만" 사용자별 서비스 관리가 시작되는 것을 전혀 방해하지 않음을 의미합니다.
추가 읽기
- 조나단 데보인 폴라드(2016).
/run/user/jim/dbus
. 기자. 스낵 가이드. 소프트웨어. jdebp.eu. - 조나단 데보인 폴라드(2016). "사용자별 사용자 서비스". 스낵 가이드. 소프트웨어. jdebp.eu.
- gnome-terminal의 실제 다중 프로세스 인스턴스 실행
- 사용자 시스템 서비스를 지속적으로 만듭니다.
- https://unix.stackexchange.com/a/323700/5132