[Utilities] Tmux 입문
Introduction
리눅스 서버 환경에서 자주 사용되는 tmux는 terminal multiplexer의 한 종류로, 하나의 터미널 콘솔에서 여러 개의 터미널을 생성하고 관리할 수 있는 기능을 제공한다.
생성한 터미널 세션들은 터미널 콘솔과 독립적으로 background에서 실행되어, 사용자가 직접 세션을 종료하거나 컴퓨터가 종료되지 않는 한 프로세스가 지속되며 생성된 세션은 여러 유저로부터 동시에(!) 접속하는 것도 가능하다. 이런 특성은 많은 수의 커맨드 명령어 기반 프로세스를 안정적으로 실행시켜야 할 때 유용하다.
오늘은 tmux의 사용법에 대해 간략히 정리해 보겠다.
1. Installation
$ sudo apt-get install tmux
tmux가 설치되어 있지 않다면, 터미널에서 apt-get을 이용해 설치하자.
2. Session
2.1 새 session 만들기
$ tmux new
설치를 완료했다면, tmux 커맨드를 사용해 새로운 세션을 생성할 수 있다.
아까, tmux는 여러 개의 터미널을 관리할 수 있는 도구라 언급했다. 그렇다면 이 하위 터미널들은 어떻게 관리되고 있는걸까? 먼저 tmux의 구성요소는 Session / Window / Pane 으로 이루어진다.
- Session은 방금 우리가 $ tmux new 를 통해 생성한 것으로, 한개 혹은 여러개의 Window로 이루어져 있다.
- Window는 Session을 이루는 구성 요소로, 한개 혹은 여러개의 Pane으로 이루어져 있다. 하나의 Window는 여러 개의 Session에 속할 수 있다.
- Pane은 터미널 하나 를 구성하고 있으며, 단 한 개의 Window에만 속해 있다.
방금 생성한 세션을 이용해 기능을 하나하나 알아보도록 하자.
아래에 초록색 status bar가 생성된 것을 볼 수 있다. 아래의 그림을 참고하자.
제일 왼 쪽의 숫자는 session 이름, 그 뒤의 숫자와 이름은 window, 그리고 마지막은 pane 이름과 시간, 날짜 정보이다. Session은 이름을 따로 지정해 주지 않으면 0,1,2,3... 의 순서로 생성되며 위 사진에서는 이것저것 켜다 보니 5번이 적혀 있다.
$ tmux new -s [session_name]
만약 세션 생성 시 이름을 지정해 주고 싶다면, 위 커맨드처럼 -s 옵션을 사용하면 된다.
2.2 Session 이름 변경
만약 그냥 session을 생성해 디폴트 넘버가 붙어 버렸고, 다시 만들기에는 이미 너무 중요한 프로세스를 시작해 버렸거나, 그저 session을 끄고 싶지 않다고 해 보자. 그럴 땐 어떻게 session의 이름을 바꿀 수 있을까? 크게 두 가지 방법이 있다.
2.2.1 Session 바깥에서 이름 변경
$ tmux rename-session -t [current-session-name] [new-session-name]
2.2.2 Session 내부에서 이름 변경
ctrl + b, :
rename-session -t [current-session-name] [new-session-name]
위 라인은 오타가 아니고 실제로 ctrl + b를 누른 후 : 키를 입력해 주어야 한다. 이후에는 tmux 명령어를 입력할 수 있는 상태가 된다.
아래는 첫 번째 방법으로 이름을 변경한 결과이다.
참고로 만들어 놓은 세션은 현재 터미널 콘솔을 종료할 때 같이 꺼지는 것이 아니라 백그라운드에서 계속 실행되고 있다. 그렇다면 다른 터미널 콘솔에서 이전에 만들어 놓은 세션은 어떻게 다시 불러올까?
2.3 Session 재접속
$ tmux attach -t [name]
위 명령어를 통해 새로운 콘솔에서 실행 중인 세션에 다시 접속할 수 있다. 세션의 이름을 정확히 입력해 주어야 한다. 세션의 이름을 까먹었다면, 2.6 Session 목록 확인 쪽의 내용을 참고하자.
참고로, 기존 콘솔을 놔둔 채로 새로운 터미널을 열고 위 라인을 실행시키면, 두 콘솔에서 같은 세션에 접속하는 것이 가능하다! 변경 사항은 실시간으로 반영된다. 협업 시에 특히 유용한 기능이다.
처음엔 세션이 콘솔을 닫아도 꺼지지 않아 당황스러울 수 있다. 그럼 세션은 어떻게 종료시킬 수 있을까?
2.4 Session 종료하기
$ tmux kill-session -t [name]
위 커맨드에 session 이름을 지정해서 종료시킬 수 있다. 혹은 단 한 개의 window와 pane밖에 없다면, ctrl + d 를 통해 종료시킬 수도 있다.
2.5 Session 나가기
만약 세션을 완전히 종료하고 싶은 게 아니라 단지 나가고 싶다면, 아래 커맨드를 사용하자.
ctrl + b, d
ctrl + b, :detach
지금까지 세션을 생성하고, 재접속하고, 종료하는 법을 알아봤다. 마지막으로 생성된 세션 목록을 보는 법을 알아보고 window로 넘어가자.
2.6 Session 목록 확인
$ tmux ls
간단하게 ls를 통해 확인할 수 있다. 결과는 아래와 같은 식이다.
3. Window
Window는 session의 하위 구성 요소이다. 처음 세션을 생성할 때는 기본적으로 하나의 윈도우가 세션 안에 생성된다. 아래와 같이 Test 세션의 status bar에 0번 윈도우가 하나 생긴 것으로 확인할 수 있다.
윈도우는 직관적으로 하나의 화면을 담당하며, 여러 개의 윈도우를 생성해 놓으면 화면을 전환하듯이 여러 개의 pane으로 구성된 화면 사이에서 자유롭게 뷰를 전환할 수 있다. Window 관련 기능을 하나하나 보도록 하자.
3.1 새 window 생성
ctrl + b, c
위 커맨드를 통해 window를 하나 더 추가할 수 있다.
실행시키고 나면, 위와 같이 새 윈도우로 전환되며 아래 status bar에 윈도우 이름이 하나 추가된 것을 볼 수 있다. 각 윈도우 내부에선 독립적으로 터미널(pane)이 구동된다. 윈도우 리스트 중 별표가 붙은 윈도우가 현재 보여지고 있는 윈도우이다.
3.2 Window 전환
맨 처음의 윈도우로 돌아가 보자. 위의 사진을 보면 윈도우마다 0,1,2,... 의 인덱스가 붙어 있는 것을 볼 수 있는데, 이 번호를 이용해 display 되고 있는 윈도우 사이의 전환이 가능하다.
ctrl + b, [0~9]
ctrl+b, 그리고 윈도우 번호를 입력하는 식으로 전환할 수 있다.
3.3 Window 종료하기
윈도우는 세션에서와 같이 남은 pane이 단 하나라면 ctrl + d 를 이용해 종료할 수 있으며, 일일이 끄기 귀찮다면 아래의 커맨드를 쓰면 된다. 정말 다 종료할 건지 묻는 verification 이후 종료하게 된다.
ctrl + b, &
4. Pane
마지막으로, 터미널 하나하나를 담당하는 pane 관련 기능을 알아보자. 기본적으로 처음 window를 생성하면 하나의 pane만을 (터미널 하나) 생성해 주는데, 이 pane 영역을 한 화면 내에서 잘게 쪼개는 식으로 window 하나 당 터미널 갯수를 늘려줄 수 있다. 아래에서 여러 커맨드와 함께 어떤 느낌인지 알아보자.
4.1 Pane 나누기 (추가)
ctrl + b, % (좌,우로 분할)
ctrl + b, " (위,아래로 분할)
아래의 사진은 위쪽 커맨드를 적용한 결과이다.
기존의 단일 pane이 양 쪽으로 나눠지며, 총 두 개의 터미널이 생성되었다. 입력 가능한 pane은 자동으로 새 pane 쪽으로 지정된다. 이 상태에서 아래 커맨드까지 적용하면 어떻게 될까?
이번엔 우측 pane이 아래, 위로 쪼개지며 총 세 개의 터미널이 생겼다. 이런 식으로 원하는 대로 window 내 pane을 늘려가면 된다. 여러 터미널 output을 동시에 봐야 할 때 유용하다. (프로세스 진행 상황을 보면서 htop, nvidia-smi를 모니터링 한다던지)
4.2 활성 pane 전환
ctrl + b, 방향키
위 커맨드를 통해 입력기가 activate 된 pane을 전환할 수 있다. 현재 activate된 pane은 주변 테두리가 초록색으로 (default 세팅 기준) 표현되므로 쉽게 확인이 가능하다. 방향키 입력은 연속으로 가능하다. 활성화된 pane에서만 터미널 명령어를 입력하는 것이 가능하다.
4.3 Pane 사이즈 조정
ctrl + b (누른채로) 방향키
현재 pane에서, ctrl+b를 누른 채로 방향키를 입력하면, 현재 pane의 영역이 입력한 방향으로 늘어나게 된다. 다른 쪽에 있던 pane은 그만큼 작아진다. 방향키 입력은 연속으로 가능하다.
4.4 Pane 종료
단순히 종료할 pane으로 가서 ctrl+d를 입력하면 된다. 지워진 pane 자리는 다른 pane이 알아서 차지하게 된다. 가끔 아무런 명령어가 먹히지 않아 ctrl+d로 종료를 할 수 없는 상태가 있는데, 이 때는 ctrl+b + x 명령어를 통해 현재 pane을 강제 종료할 수 있다.
5. Window, pane 재시작
가끔 터미널을 재시작 해야 할 때가 있다. 그런데 pane을 엄청 열심히 나눠 놔서 전부 끄고 다시 레이아웃을 조절하기에는 귀찮은 경우도 있다. 그럴 때 사용할 수 있는 기능이 있다.
$ tmux respawn-window
$ tmux respawn-pane
$ tmux respawn-pane -k (프로세스 강제 종료)
tmux를 빼고 ctrl+b, : 를 통해 tmux 명령어 창에서 입력해 줘도 된다
respawn-window는 window 전체를 재시작하며, respawn-pane은 pane 하나를 재시작한다. 이미 돌아가고 있는 프로세스가 있다면 refuse되는데, -k 옵션을 붙이면 알아서 프로세스를 종료한 후 재시작을 수행한다.
이 기능은 tmux의 remain-on-exit 옵션과 함께 사용할 때 유용하다.
$ tmux set -g remain-on-exit on
이 옵션에 대해서는, 아래의 예시를 보자.
이 옵션을 설정해 놓으면 터미널이 kill 되어도 pane의 형태가 사라지지 않은 상태로 메시지가 하나 남으며 (pane is dead), 이 상태에서 ctrl+b, : 를 입력한 후 tmux 명령어 창에 respawn-pane 을 입력하는 식으로 pane을 다시 되살릴 수 있다.
사실 tmux에는 위에 나열한 것 이외에도 다양한 기능과 명령어들이 존재하지만, 일단 본인이 유용하게, 그리고 자주 써먹는 것들 위주로 한번 읊어 보았다. 지금까지는 이 기능들만으로도 충분했지만 추후에 더 신기한 기능을 보게 된다면 추가하러 돌아오도록 하겠다.
아래는 참고할 만한 사이트이다.
References
tmux wiki (Github)