본문 바로가기
기술자료/Shell Script

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

by 와이즈캣 2023. 8. 7.
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