Linux,  Programming

[Linux] Screen 사용법

Screen이란 linux에서 물리적인 터미널을 여러 개의 가상 터미널로 다중화해주는 도구다. 각 가상 터미널은 독립적으로 동작하며 사용자 세션이 분리되어도 동작한다. 간단히 말하면 이 도구는 백그라운드로 동작하는 다중 터미널을 만들어 준다. 이걸 이용해서 백그라운드 작업을 간단히 수행할 수도 있고 회사에서 작업하던 터미널 화면을 집에 가서도 같은 터미널 화면을 보며 작업을 이어 할 수도 있다.

1. 설치방법

$ apt-get install screen
# For RedHat line (RedHat, CentOS...)
# yum install screen

2. 환경설정

~/.screenrc 에 다음과 같이 설정을 하면 interface 화면이 더 편해진다.

defscrollback 5000
termcapinfo xterm* ti@:te@
startup_message off
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n*%t%{-}%+w %= %c ${USER}@%H"
bindkey -k k1 select 0
bindkey -k k2 select 1
bindkey -k k3 select 2

3. Screen Option

OptionDescription
screen -S [session name]Session 이름을 지정해서 생성
screen -r [session name]이미 실행중인(Detached) screen session으로 재 진입시 실행하는 명령어
session -R현재 session이 실행중인게 있으면 attach하여 수행시킨다
screen -x [session name]실행중인(Attached) screen session으로 재 진입시 실행하는 명령어
-r option과 차이는 session의 status다.
screen -list (또는 ls)현재 생성된 session list를 보여준다.
screen -S [screen name] -X quit해당 session을 종료한다.
종료하기 위해서 session을 실행해서 exit 명령을 쳐도 종료된다.

4. Session Command

Session을 실행중인 상태에서 수행 가능한 명령어 목록이다.

CommandDescription
Ctrl + a, ?키보드 사용방법 확인
Ctrl + a, d현재 실행중인 session을 background로 바꾼다. 현재 session은 detached 상태가 된다.
Ctrl + a, c현재 session 위에 새 window을 생성한다.
참고로 window는 session 위에 올라가는 새 창이다.
Ctrl + a, a바로 전 window으로 이동
Ctrl + a, n (또는 space)다음 window으로 이동
Ctrl + a, p (또는 back-space)이전 window으로 이동
Ctrl + a, [숫자]해당 번째 window으로 이동
Ctrl + a, ESCCopy mode로 진입
Ctrl + a, |화면 vertical 분할
Ctrl + a, S화면 horizontal 분할
Ctrl + a, Tab분할된화면으로 넘어가기
Ctrl + a, kSession 종료하면서 나오기

참고를 위해 screen key 정보를 보는 명령어를 치면 다음과 같다.

$ (Ctrl + a, ?)
                                              Screen key bindings, page 1 of 1.

                                              Command key:  ^A   Literal ^A:  a

 break       ^B b        hardcopy    h           monitor     M           remove      X           version     v
 clear       C           help        ?           next        ^@ ^N sp n  removebuf   =           width       W
 colon       :           history     { }         number      N           reset       Z           windows     ^W w
 copy        ^[ [        info        i           only        Q           screen      ^C c        wrap        ^R r
 detach      ^D d        kill        K k         other       ^A          select      '           writebuf    >
 digraph     ^V          lastmsg     ^M m        pow_break   B           silence     _           xoff        ^S s
 displays    *           license     ,           pow_detach  D           split       S           xon         ^Q q
 dumptermcap .           lockscreen  ^X x        prev        ^H ^P p ^?  suspend     ^Z z
 fit         F           log         H           quit        \           time        ^T t
 flow        ^F f        login       L           readbuf     <           title       A
 focus       ^I          meta        a           redisplay   ^L l        vbell       ^G

^]   paste .
"    windowlist -b
-    select -
0    select 0
1    select 1
2    select 2
3    select 3
4    select 4
5    select 5
6    select 6
7    select 7
8    select 8
9    select 9
I    login on
O    login off
]    paste .
|    split -v
:kB: focus prev

참고로 terminal을 종료하더라도 background로 계속 수행하기 때문에 따로 종료시키지 않는 경우 죽지 않고 계속 수행 상태로 남는다.

5. Test

$ screen -S session1

위 명령어를 수행하면 깨끗한 새로운 창이 뜬다.

shumin@mercury:~$ screen -ls
There is a screen on:
        32767.session1  (01/06/22 23:52:16)     (Attached)
1 Socket in /run/screen/S-shumin.
shumin@mercury:~$ python3 run.py
2022-01-06 23:53:21.716378
2022-01-06 23:53:22.716928
2022-01-06 23:53:23.718053
2022-01-06 23:53:24.718929

위 상태에서 Ctrl + a, d를 통해 session detach를 하고 다시 session을 확인하면 다음과 같다.

shumin@mercury:~$ screen -ls
There is a screen on:
        320.session1    (01/06/22 23:54:16)     (Detached)
1 Socket in /run/screen/S-shumin.

이런 식으로 detached 상태가 되지만 실제 background에선 계속 thread scheduling을 하면서 수행을 멈추지 않는다.

Reference

  1. http://www.incodom.kr/Linux/%EA%B8%B0%EB%B3%B8%EB%AA%85%EB%A0%B9%EC%96%B4/screen

2 Comments

  • 지나가는 행인

    스크린에 접속하여 장기 프로그램을 구동합니다.

    그런데, 서버의 문제로 재부팅 된다면

    프로그램을 자동 실행시켜야 하는데, screen보다 nohup이 더 효율적이지 않나요?

    • shumin

      서버의 문제로 재부팅이 된다면 nohup으로 수행시킨 process 또한 죽을거에요.
      프로그램을 다시 자동 실행시키기 위해선 nohup을 사용하더라도 추가로 명시를 해줘야 nohup을 통해 process를 생성할 거에요.
      다만 screen을 통해 app을 실행하게 되면 해당 terminal session을 그대로 살려서 다시 foreground로 돌릴 수 있는 장점이 있는 것 같아서 전 screen을 사용했었습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *