Harry Potter에게는 지팡이가 있고 Thor 신에게는 철퇴가 있으며 Buckethead에게는 도끼가 있지만 이러한 모든 도구는 QWERTY에 비하면 빈약하기 짝이 없다. 명령행에서 몇 가지 명령을 실행하기만 하면 웹 사이트를 실행하여 대의를 위해 싸울 군대를 모집하거나 약탈을 일삼는 무리들을 물리칠 수 있다.
그러나 이처럼 강력한 QWERTY도 연결이 끊기면 무용지물이 된다는 치명적인 약점이 있다. 잡음이 많은 전화선, 연결이 끊긴 셀룰러나 무선 연결 또는 네트워크 시간 종료 문구는 원격 쉘에게는 분명히 치명적이다. 애플리케이션 디버깅과 같은 작업에 많은 시간을 사용하는 경우 갑자기 작업이 중단되면 좌절하거나 화가날 수 있다.
그러나 자신을 탓하지 말고 대신 GNU Screen을 사용하라. Screen은 콘솔 내에서 다중 쉘 창(즉, 실제로 호스트에 연결된 더미 터미널),
xterm 창 또는 SSH(Secure Shell) 로그인을 작성하고 관리한다. 쉘 간에 빠르게 전환할 수 있으며 쉘을 계속 실행 중인 상태로 두고
언제든지 다시 연결할 수 있다. Screen은 다수의 가상 콘솔을 효과적으로 제공한다.
그림 1에서 5에는 Screen의 기능과 동작이 표시되어 있다. 그림 1을 살펴보도록 하자. SSH를 사용하여 원격 호스트에 로그인했다고 가정한다. 초기에는 로컬 호스트(즉, 랩탑이나 데스크탑)와 원격 호스트에 원래의 쉘이 있다. 일반적으로 사용자는 원격 호스트에서 원격 쉘을 사용하여 명령을 실행할 수 있으며 출력은 암호화되어 SSH 연결을 거쳐 로컬 쉘로 전송된다. (그림에서 파란색은 현재 볼 수 있는 쉘 출력을 강조한다.) 위에서 지적한 바와 같이 로컬 쉘이나 원격 쉘 또는 이 두 쉘 간의 연결이 종료되면 원격 쉘도 종료되고 수행 중인 작업도 사라져버린다.
그림 1. 일반적인 SSH 연결
그림 2에는 원격 호스트에서 Screen을 실행한 후의 상태가 표시되어 있다. Screen 유틸리티를 실행하고 새로운 쉘 창인 A가 생성되면 이 창을 통해 명령을 실행할 수 있다. 파란색으로 암시되어 있듯이 출력은 쉘에서 시작하여 Screen과 원격 로그인을 통과하여 SSH 연결을 거쳐 로컬 로그인에 도달하기 때문에 사용자는 A의 출력을 볼 수 있다.
그림 2. Screen을 이용한 쉘 창 관리
Screen은 그 자체로는 아무런 의미가 없으며, 자체적으로 관리하는 실행 중인 창 가운데서 사용 가능한 창을 선택하기 위한 프록시이다. Screen은 창의 출력을 한 번에 하나씩만 표시할 수 있다. Screen을 가상 KVM(keyboard-video-mouse) 스위치처럼 생각할 수도 있다.
그러나 그림 3과 같이 Screen에서 분리될 수도 있다. 이런 경우 Screen에서 관리하는 모든 창과 마찬가지로 Screen 프록시도 동작이 유지되지만 Screen에 대한 연결은 잠시 분리되고 원격 로그인 쉘 프롬프트가 사용자에게 리턴된다.
그림 3. Screen에서 분리되어도 창은 지속됨
그림 4에는 가능한 시나리오가 표시되어 있다. Screen에 대한 연결이 다시 설정되고 추가로 두 개의 창(B와 C)이 작성되었다. 창 A와 B에는 쉘과 모든 종속된 작업이 계속해서 실행되지만 사용자는 C의 출력만을 볼 수 있다. 물론 여러 가지 작업의 상태를 모니터하기 위해 창을 서로 전환할 수 있다.
그림 4. Screen은 다수의 창을 관리할 수 있음
마지막으로 그림 5에는 Screen이 분리되고 원격 로그인이 종료된 상황이 표시되어 있다. 그러나 Screen과 해당 창은 동작이 계속 유지된다. 사용자가 다시 로그인하여 Screen에 다시 연결하면 아무런 문제 없이 계속 작업을 수행할 수 있다.
그림 5. Screen에 자유롭게 연결하거나 분리할 수 있음
정기적으로 원격 서버에 액세스하여 소프트웨어를 개발하거나 유지보수하는 경우에는 GNU Screen이 필수다.
Screen의 원래 버전은 10여 년 전에 출시되었기 때문에 시스템(일반적으로 /usr/bin/screen)에 이 유틸리티가 있을 가능성이 있다.
그러나 시스템에 Screen이 없다면 사용 중인 배포판의 패키지 관리자를 통해 쉽게 설치할 수 있다. 예를 들어, Ubuntu와 같은 Debian Linux®
변종을 사용하는 경우에는 apt-get을 사용하여 Screen을 간단히 설치할 수 있다.
$ sudo apt-get install screen |
이와 달리, 소스에서 빌드할 경우에는 GNU Screen 프로젝트 페이지(참고자료의 링크 확인)에서 최신 코드 번들을
다운로드해야 한다. 이 기사를 쓰는 현재 Screen의 최신 릴리스는 버전 4.0.3이고 단지 몇 달 전인 2008년 8월에
게시되었다. 처음부터 빌드하고 설치하려면 코드를 다운로드하여 압축을 풀고 생성된 소스 디렉토리로 변경한 후 ./configure, make 및
sudo make install을 다음과 같이 차례로 실행한다.
$ wget http://ftp.gnu.org/gnu/screen/screen-4.0.3.tar.gz $ tar xzf tar xzf screen-4.0.3.tar.gz $ cd screen-4.0.3 $ ./configure this is screen version 4.0.3 ... $ make CPP="gcc -E " srcdir=. sh ./osdef.sh ... $ sudo make install ... You may also want to install ./etc/etcscreenrc in /usr/etc/screenrc. $ sudo cp ./etc/etcscreenrc /usr/etc/screenrc |
Screen을 설치하였으므로 이제 사용할 차례이다. 이 유틸리티의 man 페이지를 확인하려면 man screen을 입력한다.
Screen을 사용하려면 Screen을 실행해야 한다. 라이센스 관리자가 표시되면 Return을 누른다. 그러면 새로운 로그인 쉘 프롬프트가 표시된다. (아래의 표현에서는 다양한 쉘 인스턴스를 구분하고 그림 1에서 5까지 비교하기 위해 각 쉘 프롬프트 앞에 인위적으로 별명이 추가되었다.)
Local $ ssh remote.example.com Last login: Sun Dec 21 17:23:16 2008 from local.example.com Remote $ hostname remote.example.com Remote $ screen A $ top |
이제 상황은 그림 2와 동일하다. 비록 보이지는 않지만 Screen 세션이 실행하고 있으며 창 A가 활성화되어 시스템 성능 정보를 몇 초 단위로 새롭게 표시하는 top 시스템 모니터를 실행 중이다.
세션에서 실행 중인 모든 창과 스크린 세션을 잠시 분리하려면 Ctrl-a를 누른 후 d("분리할" 경우 소문자 D를 사용)를
입력한다. Ctrl-a는 Screen 명령 접두부이며 d는 분리하기 위한 명령이다. 이제 그림 3과 같은 시나리오 상태가 되었다. Screen 세션과 창 A는
여전히 동작 중이다. 확인하려면 screen -list를 실행한다.
$ screen -list There is a screen on: 21020.pts-2.remote (Detached) 1 Socket in /tmp/screens/S-strike. |
screen -list 명령은 사용할 수 있는 모든 세션을 표시한다. (다수의 Screen 세션을 동시에 실행할 수 있으며
각 세션은 동시에 동작하는 창을 자체적으로 보유할 수 있다.) 이러한 상황이 그림 6에 표시되어 있다. 각 Screen 인스턴스는 자체적으로
실행된 현재 창을 추적한다. 이와 같은 Screen의 고급 사용법에 관한 팁은 나중에 살펴본다. 세션 번호 21020이 분리되었으며
적절하게 표시되었다. Screen 세션이 하나만 존재하는 경우에는 screen -r을 사용하여 이 세션에 직접 다시 연결할 수 있다. Screen 세션과의
연결 상태와 관계없이 top은 계속해서 작동한다.
그림 6. Screen은 다중 세션을 제공하며 각 세션에는 다중 창이 있음
그림 4를 다시 재현하려면 현재 세션에 다시 연결한 후 Ctrl-a을 누르고 c("작성"할 경우 소문자 C를 사용)를 입력하여 새 창을 작성한다. 그 다음에 Ctrl-a를 누르고 c를 다시 입력한다. 이제 세 개의 창을 관리하는 하나의 Screen 세션이 작성되었다.
세션에서 메뉴 형태로 사용 가능한 창을 보려면 Ctrl-a를 누른 후 현재 창에서 큰따옴표 (")키를 입력한다.
Num Name Flags 0 bash $ 1 bash $ 2 bash $ |
기본적으로 창의 이름은 창을 실행하는 첫 번째 명령인 쉘에서 따오며 위 메뉴에는 3개의 bash 창이 있다. 창 메뉴를 탐색하려면 화살표 키를 사용하여 목록의 위, 아래로 이동한 후 창을 선택하고 Return을 누른다.
현재 창을 닫으려면 해당 창의 쉘 프롬프트에서 exit를 입력하거나 키보드 단축키 Ctrl-a를 누른 후 k("닫을" 경우 소문자 K를 사용)를
입력한다. 후자를 사용하는 경우 해당 창의 하단에 창을 닫을 것인지를 확인하는 경보가 표시된다. y("예"를 선택할 경우 소문자 y를 사용)를 눌러서
승인하거나 n("아니오"를 선택할 경우 n을 사용)을 눌러 명령을 취소한다. Screen 세션에서 실행 중인 모든 창을 닫으면
원래의 screen 명령은 메시지를 표시한 후 종료된다.
Remote $ screen ... Create and manipulate windows ... ... Exit from all windows... [screen is terminating] Remote $ screen -list No Sockets found in /tmp/uscreens/S-supergiantrobot. |
함께 수행하고 있고 열린 창을 모두 닫은 경우 screen -list 명령을 실행하면 No sockets...이 표시되어 사용할 수 있는 Screen 세션이 없다는 것을 알려준다.
이제까지 Screen 세션에서 다중 창을 작성하는 방법을 살펴보았다. 이것만으로도 명령행에서 실행한 작업을 계속 유지할 수 있으며 이 작업을 다시 잃어 버리지도 않을 것이다.
그러나 동시에 열려있는 모양이 같은 창을 관리하는 일은 분명히 혼란스러울 수 있으며, 창을 열지 않고도 각 창을 쉽게 구분할 수 있다면 더 좋을 것이다. 특히 세션에서 분리한 후 상당한 시간이 지나 다시 연결한 경우라면 더욱 그렇다.
실제로 Screen에는 작업 환경을 사용자 정의할 수 있는 다양한 옵션과 도구가 있다. 각 창의 이름을 지정할 수 있으며 상태 표시줄을 각 창의 하단에 놓아서 창을 구분할 수도 있다.
창의 이름을 지정하려면 해당 창을 활성화한다. Ctrl-a A("이름"을 지정할 경우 대문자 A를 사용)를 누른 후 기존 별명을 제거할 필요가 있으면 백스페이스를 누른 후 다음과 같이 프롬프트에 의미있는 이름을 입력한다.
Num Name Flags 0 Window A $ 1 Window B $ 2 Window C $ |
이 과정은 그림 7에 표시되어 있으며 여기서는 창에 Window A라는 태그가 붙어 있다. A 창의 별명은 고유할 필요가 없다.
그림 7. 각 창에 의미있는 이름을 할당할 수 있음
직접 시각적인 기호를 추가로 제공하여 상태 표시줄을 통해 창을 구분할 수 있다. 선호하는 텍스트 편집기를 실행하여 홈 디렉토리에 다음과 같은 내용으로 .screenrc 파일을 작성한다.
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
|
이러한 .screenrc 구성 파일을 저장하면 새로운 창에는 창의 이름이 있는 상태 라인이 표시된다. 그림 8에는 상태 라인이 있는 창이 표시되어 있다.
그림 8. 상태 라인을 사용하여 각 창을 바로 식별할 수 있도록 하기
간단하게 소개하기에는 Screen에는 너무나 많은 기능이 있지만 능숙하게 사용하려면 어느 정도의 노하우와 몇 가지 유용한 옵션을 알아야 한다. 다음은 몇 가지 유용한 팁이다.
- 새 창을 열려면 창에서 인수 없이
screen을 입력한다. Ctrl-a와 c를 차례로 누를 때와screen을 입력할 때는 후자가 새 세션을 즉시 구성하는 명령행 옵션을 제공한다는 점을 제외하면 동일하다. screen -t 이름을 사용하면 창을 작성할 때 창의 이름을 지정할 수 있다. 즉, 새 창을 작성하고 이 창에 debugger라는 이름을 지정하려면 Screen에서 관리하는 창으로 이동하여screen -t debugger를 입력한다. 창 메뉴를 열면 옵션 중 하나에 debugger가 표시된다.- Screen 세션에서 분리된 경우
screen -p ID를 사용하여 특정 창으로 다시 연결할 수 있으며 여기서 ID는 숫자나 이름이다. 다음과 같이 확인해 보도록 하자.Local $ ssh remote.example.com Remote $ screen -t ghost Ghost $ screen -t new New $ ... Press Control-a d to detach... Remote $ screen -r -p ghost Ghost $
screen -L을 사용하여 모든 창의 출력을 로그할 수 있다. 각 창에는 ~/screenlog.n이라고 하는 별도의 로그 파일이 있으며 여기서 n은 해당 창 메뉴에 표시되는 창 번호이다. 이는 시스템을 다시 구성 중인 경우와 같이 복잡한 단계를 기록할 수 있는 유용한 기능이다.- 완전한 단축키 목록은 Screen 문서에서 확인할 수 있다. 가장 유용한 조합으로는 다음을 들 수 있다. Ctrl-a를 누른 후 0(숫자 0)에서 9까지 선택적으로 입력하면 특정 창으로 즉시 전환할 수 있으며, Ctrl-a와 C(창을 "지울 경우" 대문자 C를 사용)를 차례로 누르면 창에 표시된 내용을 지울 수 있으며, Ctrl-a와 H를 누르면 로깅을 켜거나 끌 수 있고, Ctrl-a를 두 번 누르면 현재 창과 이전 창 사이를 전환할 수 있으며 Ctrl-a와 Ctrl-\(백슬래시)를 차례로 누르면 모든 창과 현재의 Screen 세션을 종료할 수 있다.
앞서 언급한 바와 같이 사용자는 동시에 여러 개의 Screen 세션을 작성할 수 있으며, 여기서 각 세션은 여러 개의 창을
관리할 수 있다. 각 세션에는 고유한 식별자가 있으며 screen -list를 사용하면 사용 가능한
모든 세션 목록을 작성할 수 있다. 창에서와 마찬가지로 세션에도 이름을 지정하여 처리에 따라 참조하도록 할 수 있다. screen -S 레이블을
사용하여 새 세션을 할당한다.
이름이 지정된 세션을 유용하게 사용하려면 이 세션을 공유해야 한다. 허용된 경우 기존 세션에 연결하여 해당 세션 창을 사용하는 다른 사용자와 협력을 할 수 있다. 심지어 세션 내에서 독립적으로 다른 창으로 전환할 수도 있다. 같은 창에 다른 사용자가 있는 경우 입력하거나 표시되는 모든 내용이 모든 사용자에게 전달된다. 다음과 같이 확인해 보도록 하자.
- 작업하고 로그인할 시스템을 선택한다.
screen -S sharing -t one>을 입력하여 이름이 지정된 새 Screen 세션을 작성하고 적절히 공유하며 새 창에는 one이라는 이름을 지정한다.screen -t two을 사용하여 두 번째 창을 작성한다.- 원할 경우 Ctrl-a와 d를 차례로 누르거나
screen -list,screen -r sharing을 입력하거나 Ctrl-a와 "를 차례로 눌러서 작업을 확인한다. - 해당 창에서
echo를 입력하여 one이라는 이름이 지정된 창에서 출력을 일부 표시한다. - 같은 시스템에서 두 번째 로그인 창을 연다.
- 이 창에서
screen -x -r sharing -p one을 입력한다.-x옵션은 다중 사용자 모드를 지정하며-p one은 one이라는 이름이 지정된 창에 직접 연결한다. 그림 9와 같이 다른 로그인 세션과 출력이 동일한지 즉시 확인해야 한다.
그림 9. 세션을 공유할 수 있음
각 로그인 창을 사용하여 출력이 표시되도록 UNIX® 명령을 실행하고 Screen 키보드 단축키를 눌러서 공유 세션에 있는 창 사이를 전환한 후 그 결과를 지켜본다.
Screen을 더 자세히 배우려면 분리 화면 모드에 관해 읽고 기존의 잠금 기능을 사용하여 개별 창에 대한 액세스를 막을 수 있는 방법을 학습한다.
Screen은 명령행에서 실행하는 모든 작업에 매우 유용하게 사용할 수 있는 뛰어난 도구이다. 사실상, 한 번 사용하면 계속해서 사용하게 될 것이다.
교육
-
Speaking UNIX에서는 이 시리즈의 다른 부분을 볼 수 있다.
-
UNIX 쉘에 관해 자세히 학습할 수 있다.
-
developerWorks의 AIX 및 UNIX 영역에서는 AIX 시스템 관리의 모든 기능에 관한 다양한 정보와 UNIX 능력을 개선할 수
있는 정보를 볼 수 있다.
-
New to AIX and UNIX에서 AIX와 UNIX에 대한 자세한 정보를 볼 수 있다.
-
기술 서점에서 다양한 기술 주제와 관련된 서적을 살펴보자.
제품 및 기술 얻기
-
Screen의 소스 코드를 다운로드할 수 있다.
토론
-
Screen 메일링 리스트에 참여하여 팁과 기법을 학습하자.
-
developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.
-
AIX 및 UNIX 포럼에 참여하자.
- AIX Forum
- AIX Forum for developers
- Cluster Systems Management
- IBM Support Assistant Forum
- Performance Tools Forum
- Virtualization Forum
- 기타 AIX and UNIX Forums
Martin Streicher는 프리랜서 Ruby on Rails 개발자이며 Linux Magazine의 편집장을 역임했다. Purdue University에서 컴퓨터 과학 석사 학위를 받았으며 1986년부터 UNIX 계열 시스템을 프로그래밍하고 있다. 그리고 예술 작품과 장난감 수집을 좋아한다. 이메일 주소는 martin.streicher@gmail.com이다.
등록 상표 | My developerWorks 이용약관
