계정: 로그인
AA 📝
GNU Screen

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

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

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

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

주요 명령

스크린 외부 (옵션)

스크린 내부 (명령)

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

설정

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)해야합니다.

/!\ 공사중