기술자료/Shell Script

터미널에서 GUI 프로그램 원격 실행 (Remote Widows Run By Terminal)

와이즈캣 2023. 8. 7. 12:05
728x90
반응형

먼저 해당 GUI 창을 띄울 세션 PID를 알아야 한다.
아래는 PID가 2309일 경우를 전제하였을 경우의 예시이다.

export DISPLAY=$(cat /proc/2309/environ | tr '\0' '\n' | grep DISPLAY | cut -d '=' -f2-)

export DBUS_SESSION_BUS_ADDRESS=$(cat /proc/2309/environ | tr '\0' '\n' | grep DBUS_SESSION_BUS_ADDRESS | cut -d '=' -f2-)

세션 PID를 모를 경우 검색해야 하는데 gnome-shell이나 gnome-session이라는 이름을 사용할 경우
보통 pidof 명령어를 사용하여 아래처럼 알아 낼 수 있다.

pidof gnome-shell

pidof gnome-session

위의 경우 PID를 간단하게 알아 낼 수 있지만 여러 세션이 떠 있을 경우 구별하기가 어렵거나 자동 스크립트화가 곤란하다.
이럴 경우 아래와 같이 ps 명령을 고려해 볼 수 있다.

echo $(ps -ux | grep bin/gnome-shell | awk 'NR == 1{print $2}')

echo $(ps -ux | grep bin/gnome-session | awk 'NR == 1{print $2}')

위의 설명을 잠깐 해 보면,
grep은 gnome-shell이나 gnome-session을 포함한 문자열을 선택하도록 한다.
awk는 검색된 문자열들 중에서 1번째 줄만 선택하고 2번째 열을 선택하도록 해 준다.
결과적으로 gnome-shell이나 gnome-session을 포함한 PID를 자동으로 추출한다.

완전히 자동화된 PID 추출을 위해서는 해당 시스템이 gnome-shell 혹은 gnome-session을 사용하는지
판단하도록 스크립트를 작성하면 좋은 데 이건 생략한다.

위의 내용을 종합하여 만든 스크립트는 아래와 같다.

export DISPLAY=$(cat /proc/$(ps -ux | grep bin/gnome-shell | awk 'NR == 1{print $2}')/environ | tr '\0' '\n' | grep DISPLAY | cut -d '=' -f2-)

export DBUS_SESSION_BUS_ADDRESS=$(cat /proc/$(ps -ux | grep bin/gnome-shell | awk 'NR == 1{print $2}')/environ | tr '\0' '\n' | grep DBUS_SESSION_BUS_ADDRESS | cut -d '=' -f2-)

이제 완료되었으니 현재 터미널에서 GUI 관련 App을 실행할 경우 해당하는 그래픽 GUI 세션에서 결과 창이 뜨는 것을 볼 수 있다.

필자가 사용한 명령은 아래 2가지 이다.

gnome-terminal

jtop

PS) 위의 쉘스크립트는 bash 기반에서 테스트 하였음으로 다른 쉘을 사용할 경우 결과가 차이날 수 있다.

728x90
댓글수0