계정: 로그인
AA

http://www.gnu.org/software/screen/

GNU 프로젝트의 일환으로 개발된 터미널/콘솔용 창 관리자로서, 주요 기능들은 다음과 같다:

  • 지속 실행: GNU Screen 내에서 실행시킨 프로그램은 실행자의 접속이 끊어져도 실행되며, 다른 기계에서 다시 접속해 계속 제어할 수 있다.

  • 창 분리: 마치 X 윈도우의 창 관리자처럼, 하나의 터미널/콘솔 화면을 여러개의 영역으로 나누고 영역 사이를 오가며 작업할 수 있다.

  • 세션 공유: 하나의 스크린 세션에 여러 사용자가 동시에 접속하여 공동으로 작업하거나 다른 사람의 작업 과정을 관찰할 수 있다.

기본적인 개념은 GNU_Screen에 잘 소개되어있고 man page의 설명도 자세하므로, 이 문서에는 아주 간단한 (간혹 잊기 쉬운) 명령어, 옵션, 단축키 등을 정리한다.

아래 내용들 중 "주요 명령" 부분과 "설정" 부분은 김충길 님께서 2003/04/23 18:46에 KLDP BBS에 올리신 강좌들(강좌 1, 강좌 2)을 기초로 편집/추가한 것임.

주요 명령

스크린 외부 (옵션)

  • screen -S foo : 새로운 스크린 foo를 만들고 그 안으로 진입

  • screen (-ls|-list) : 현재 만들어져있는 스크린들의 목록 나열

  • screen -l : 로그인 모드 켜기

  • screen -r [foo] : Detach된 스크린 foo 안으로 재진입 (attach). Detach된 스크린이 하나뿐이면 생략 가능.

  • screen -c file : 파일 file에 설정된 창들이 미리 열림. 설정 파일 내용은 예를 들어:

    screen 1 sirc freenode.com
    screen 2 top
    screen 3 cal
  • screen -x : Detach되지 않은 스크린에 진입. 두 터미널에서 하나의 스크린 공유 가능. (맨페이지 참조)

  • screen -exy : Command key 변경 (디폴트는 Ctrl-a). x가 새 key이고 y는 그 문자를 찍기위한 대체 문자. 예를 들어 Ctrl-o로 바꾸려면:

    screen -e^Oo   혹은   screen "-e^Oo"

스크린 내부 (명령)

일단, 스크린 내부에서의 일명 command key기본적으로 Ctrl-a로 정해져있고, 필요하다면 바꿀 수도 있습니다. 아래에서 Kc는 설정된 command key입니다:

  • Kc d : 스크린 밖으로 살짝 떨어져나가기 (detach)

  • Kc c : 스크린 내부에서 새 창 띄우기

  • Kc w : 스크린 내부 창들의 목록 나열 ('*'는 현재 창, '-'는 바로 전 창)

    0-$ zsh   1$ zsh   2*$ zsh
  • Kc K : 현재 활성화된 창을 강제로 죽이기

  • Kc Ctrl-a : 바로 전 창으로 (Ctrl키를 계속 누르고있거나 다시 함께 눌러야 함.)

  • Kc 0 : 0번째 창으로

  • Kc 9 : 10번째 창으로

  • Kc S : 화면 수평 분할

  • Kc | : 화면 수직 분할

  • Kc Tab : 분할된 영역 간의 커서 이동

  • Kc X : 분할된 영역들 중 현재 영역 닫기 (즉, 분할 해제; 영역 속에 보이던 창이 죽지는 않음)

  • Kc x : 스크린 잠금 (암호 입력 화면 표시)

  • Kc [ : copy mode(스크롤백 화면)로 전환

    • vi의 이동키로 이동 가능
    • Space : 복사 시작지점/끝지점 선택 (선택 완료시 자동 복사)

    • Esc Esc : copy mode 해제

  • Kc ] : copy mode에서 복사한 내용 붙여넣기

설정

screen이 실행될때 읽어 들이는 설정 파일은 $HOME/.screenrc 파일. 대부분의 경우 .screenrc는 디폴트로 잘 설정되어 있음.

일단 이 파일이 있다면 열어서 아래와 같이 해당 라인을 찾아 수정한다:

defhstatus "<^En-^Et> ^EW [^EM/^Ed(^ED) ^Ec]"
hardstatus lastline

defscrollback 1000

defhstatus는 hardstatus를 어떻게 표시할까를 나타내는 것. ^En은 현재 창번호를, ^Et는 현재 창 타이틀을 표시. ^EW는 나머지 창들에 대해서 표시. (이부분은 screen 버전에 따라 약간 다르게 동작할 수 있음.)

그 다음 hardstatus lastline은 hardstatus를 화면상의 맨 아래에 표시. (창이 여러개일 때 편리.)

defscrollback은 screen의 개별 창마다 스크롤 사이즈를 몇 라인으로 할 것인지를 결정. scrollback을 좀 길게 사용하면 출력 내용을 살펴 볼때 유용함. (터미널 자체의 스크롤백을 사용할 수도 있으나 좀 불편)

예제

원격 실행 유지

원격 기계에 GNU Screen과 어떤 프로그램 foo가 설치되어있다고 가정할 때, 기본적인 줄거리는 다음과 같다:

  1. 원격 기계에 ssh (혹은 telnet) 접속
  2. 원격 기계 상에서 일단 GNU Screen을 실행시키고 (자동적으로) 스크린 내부로 진입

    $ screen -S myjob

    여기서 -S 옵션은 스크린에 이름을 부여하는 옵션이고 myjob이 그 이름임. 이 과정을 마치면 대부분의 경우에 화면이 비워지고 새로운 쉘 프롬프트가 떨어진다.

  3. (optional) 자신이 현재 스크린 내부에 있음을 확인

    $ screen -ls
    There is a screen on:
            24096.myjob     (Attached)
    1 Socket in /var/run/screen/S-reeseo.
    
    $

    위 메세지는 "reeseo 사용자가 만든 스크린이 하나 있으며 그 이름은 myjob이고, 현재 자신이 그 스크린 내부에 Attach되어있다"는 뜻이다.

  4. 이제 실행 시간이 10여 시간 이상 걸리는 프로그램 foo를 실행시킵니다.

    $ foo
    blah blah 99...
    blah blah 98...
    blah blah 97...
    ...
  5. 아직 실행이 끝나지 않아서 최종 결과를 확인하지 못했지만, 모종의 이유로 원격 기계로의 접속을 끊어야하는 상황이 발생했다. 이럴 땐 Ctrl-a-d를 누른다. (Ctrl 키를 계속 누른 채로 a 키와 d 키를 연달아 누름)

    blah blah 36...
    blah blah 35...
    blah blah 34...
    ( pressing Ctrl-a-d )
    
    [detached]
    $

    detached라는 메세지와 함께 쉘 프롬프트가 떨어진다.

  6. (optional) 실행 중이던 프로그램이 어디로 갔는지 궁금하면 스크린 상황을 다시 확인해본다

    $ screen -ls
    There is a screen on:
            24096.myjob     (Detached)
    1 Socket in /var/run/screen/S-reeseo.
    
    $

    myjob 스크린은 여전히 살아있으며, 다만 자신이 그 스크린으로부터 detach되어있을 뿐이다.

  7. 원격 접속 종료

    $ logout
  8. 접속을 끊어야했던 상황이 해제된 후, 원격 기계에 다시 접속 (혹은 또다른 제 3의 기계에서 접속해도 상관 없음)
  9. (optional) 원격 기계의 스크린이 여전히 detached 상태로 살아있는지 확인

    $ screen -ls
    There is a screen on:
            24096.myjob     (Detached)
    1 Socket in /var/run/screen/S-reeseo.
    
    $
  10. 이 스크린에 다시 진입 (attach)

    $ screen -r myjob
    blah blah 2...
    blah blah 1...
    blah blah 0...
    final result: blah blah 39t398ru32
    
    $
    아까 실행중이던 foo 프로그램은 그동안 계속 잘 실행되고 있었고, 최종 결과까지 나와있다.
  11. 이제 필요 없어진 myjob 스크린을 (detach하는게 아니라) 완전히 없애버린다

    $ logout
    
    [screen is terminating]
    $
  12. (optional) 스크린이 정말 깨끗하게 사라진건지 확인

    $ screen -ls
    No Sockets found in /var/run/screen/S-reeseo.
    
    $
  13. 원격 기계로의 접속 종료

창 관리

창 관리를 위해서는 일단 스크린을 하나 만들고 그 내부로 진입(attach)해야합니다.

/!\ 공사중