Tmux에 대해 알아보자

Tmux에 대해 알아보자

Tmux, 왜 필요한가?

Linux로 작업을 하다보면, 하나의 작업을 위해 다수의 터미널을 띄워야할 때가 자주 있다. 예를들어, 이 블로그 글을 작성하기 위해선 다음처럼 세 개의 터미널이 필요하다.

  1. File management: lf 를 사용하여 이미지 등 포스트 첨부파일들을 관리하고, post를 publish하는 script를 실행하는 목적으로 사용.
  2. Post editing: neovim 을 사용하여 블로그 포스트를 작성하는데 사용.
  3. Hugo local server: 포스트 미리보기를 위한 hugo local server 가동.

이 터미널들은 블로그 포스팅이라는 하나의 목적을 위해 존재하며, 번갈아가면서 하나씩 나의 집중을 받게 된다.

이처럼 다수의 터미널들을 별도의 창으로 열어서 사용하다보면 자연스럽게 다음과 같은 생각을 하게 된다.

  1. 이 다수의 터미널들이 한 묶음으로 다닐 수 있으면 좋겠다.
  2. 실수로 터미널 창을 닫더라도, 각 터미널이 수행하던 프로세스는 백그라운드에서 계속 동작하고 있으면 좋겠다. 다시 연결하면 그대로 사용도 할 수 있고.

이런 목적으로 만들어진 것이 tmux 라는 terminal multiplexer이다.

핵심 기능은 딱 두 개다.

  1. 하나의 작업을 위한 여러 터미널들을 한 개의 창으로 묶는다.
  2. 실수로 터미널 창을 종료해도 각 터미널의 프로세스들은 백그라운드에서 계속 동작하며, 필요시 다시 그 창을 복구할 수 있다.

그럼, 함께 tmux를 설치하고, 기본 개념과 사용법을 알아보자.

Tmux 설치하기

각자 리눅스 배포판에 맞춰 설치해주도록 하자. 아치 리눅스를 쓴다면 다음을 실행하면 된다.

bash
sudo pacman -S tmux

Tmux 기본 개념

설치가 끝났으면 기본 개념에 대해 알아보자.

서버와 클라이언트 구조

Tmux는 서버와 클라이언트 구조를 사용한다. 그 덕분에, 실수로 터미널이 닫아도 백그라운드에서 동작중인 서버에서 터미널에서 하던 작업이 이어질 수 있고, 언제든지 새 클라이언트를 그 작업에 다시 연결할 수 있다.

Session, window, pane

Tmux는 session, window, pane이라는 세 가지 구분 기준을 사용한다. 먼저, session은 가장 큰 단위의 구분으로, 앞서 hugo blog post 작성의 예시에서처럼 여러 터미널들을 통해 달성하려는 하나의 과제 단위를 구분하는데 쓰면 좋다.

다음으로 window는 각 session 하부에 위치하는 단위로, 그 session에 속하는 터미널이라고 생각하면 된다. 기본적으로 새 session을 생성하면 각각 하나의 window만 갖고 있다. 필요하다면 session은 원하는 만큼의 window를 가질 수 있고, 그들 사이를 자유롭게 오갈 수 있다.

마지막으로 pane은 각 window를 잘라서 사용하는 단위다. 그러니까, 한 눈에 여러 터미널을 확인해야할 필요가 있을 때, 한 window를 분할하여 여러개를 만든 것이 pane이다. pane은 세로 및 가로 어느 방향으로든 나눌 수 있다.

아래의 두 그림은 내가 이 글을 작성하는 현재 사용하고 있는 session과 window 구성이다. 나는 두 개의 session을 사용하고 있으며, 1번 session은 한 개의 window를, 2번 session은 세 개의 window를 가진다.

blog session과 그 하부 세 개의 window(fm, edt, svr)
blog session과 그 하부 세 개의 window(fm, edt, svr)
각 session들 간 전환 창에서 session과 window 구성을 확인할 수 있음.
각 session들 간 전환 창에서 session과 window 구성을 확인할 수 있음.

다음 그림은 하나의 window를 세 개의 pane으로 나눠서 쓰는 예시를 보여준다.

하나의 window(lf-cmatrix-cbonsai)를 세 개의 pane으로 나눠서 사용하는 예시. 세 개의 터미널을 한눈에 볼 수 있다.
하나의 window(lf-cmatrix-cbonsai)를 세 개의 pane으로 나눠서 사용하는 예시. 세 개의 터미널을 한눈에 볼 수 있다.

기초 기능 익히기

아마 더 많은 기능이 있겠지만, 내가 익혀서 사용하고 있는 기능들만을 간단히 소개해보고자 한다. 개인적으로 pane은 잘 사용하지 않아서, 생략한다.

새로운 session 열기

새로운 session은 두 가지 방식으로 열 수 있다. 먼저, 이름을 붙이지 않는 방식이다.

bash
tmux

이렇게 사용해도 되지만, 각 session들 간 명확한 구분이 필요하다면 이름이 붙여진 session을 만들 수 있다.

bash
tmux new -s session-name #session-name을 원하는 것으로 대체하자.

위 두 방식을 사용하면 새로운 session이 열리게 되고, 터미널 아래쪽에 초록색으로 tmux가 사용중임을 알리는 하단바(?)가 나타난다.

이름을 설정하지 않고 새 session을 연 모습. 아래쪽에 초록색의 하단바가 보인다. 이 session은 이름 대신 index 번호를 가진다. 여기선 3이다.
이름을 설정하지 않고 새 session을 연 모습. 아래쪽에 초록색의 하단바가 보인다. 이 session은 이름 대신 index 번호를 가진다. 여기선 3이다.

Session 목록 확인하기

터미널에서 다음의 명령어를 통해 현재 동작중인 session들을 확인할 수 있다.

bash
tmux ls

그러면 아래와 같이, session들의 목록과 각 session에 포함된 window의 개수가 나타나고, 현재 attach 여부까지도 알 수 있다.

# tmux ls의 결과
3: 1 windows (created Thu Jul 24 16:49:21 2025)
blog: 3 windows (created Wed Jul 23 10:30:07 2025) (attached)
engine: 1 windows (created Wed Jul 23 10:25:42 2025)

Detach와 attach

앞서 언급한 바와 같이, tmux는 창을 닫더라도 서버가 백그라운드에서 해당 작업을 유지한다. 따라서 원하면 언제든지 session을 detach하고, 또 attach 할 수 있다.

먼저, detach는 다음의 키 조합으로 할 수 있다. 여기서 C-b는 Ctrl과 b를 동시에 누르는 것을 의미하고, +로 연결된 것은 순차적으로 눌러야 한다는 걸 의미한다.

C-b + d 

이걸 누르는 게 귀찮다면, 그냥 창 자체를 종료해버리면 알아서 detach가 된다.

다음으로, attach는 두 가지 방식을 사용할 수 있다. 먼저 가장 최근에 사용한 session을 자동으로 골라서 attach하는 방식이다. 다음의 명령어를 터미널에 입력해주자.

bash
# Attach to the recently used session
tmux attach

다음으로, 원하는 session을 골라서 attach하려면 해당 session의 이름이나 index 번호를 통해 그 session을 attach 할 수 있다. 필요하면 앞서 배운 tmux ls를 통해 먼저 session 이름을 확인하자.

bash
# Attach to a specific session
tmux attach -t session-name #session-name을 지정했다면 그 이름을, 지정하지 않았다면 하단에 표시되어 있던 index 번호를 입력해주자.

window 추가하고 삭제하기

각 session은 nn개의 window를 가질 수 있다. 그러니 원하는 만큼 추가를 해주도록 하자.

Window 추가 명령어는 다음과 같다.

C-b + c

Window를 닫는 명령어는 다음과 같다.

C-b + &

현재 사용중인 window의 이름 바꾸기

여러 window가 있으면 뭐가 뭔지 헷갈리게 된다. 그래서 각각에 기능을 명시해줄 필요가 있다.

다음의 명령어를 입력하면, window 이름을 원하는 것으로 지정할 수 있다.

C-b + ,

Session 및 window들 사이의 전환

여러 session과 window를 쓴다면 그들 사이에서 왔다갔다 해야할 때가 있다. 다음의 명령어를 통해 session과 window들 사이의 전환이 가능하다.

C-b + w

이를 입력하면 모든 session과 window의 목록이 뜨게 되고, 이들 중 원하는 곳에서 Enter를 눌러주자.

`C-b + w`를 통한 session, window 간 전환
C-b + w를 통한 session, window 간 전환

이 방식 이외에도 앞/뒤 session으로 바로 이동하는 명령어도 있다.

C-b + ( # 앞 session으로의 이동
C-b + ) # 뒤 session으로의 이동

또한, window들 간에도 앞/뒤로 바로 이동하는 명령어도 존재한다.

C-b + p # 앞 window로의 이동
C-b + n # 뒤 window로의 이동

session, window, pane의 종료 방식

각각을 종료하는 명령어가 존재하지만, 기억하기가 귀찮아서 나는 그냥 모두 다음의 명령어로 종료하는 방식을 사용한다.

bash
exit

물론, 여러 개의 window, pane이 존재한다면 각각 다 exit을 해줘야하긴 한다.

Tmux를 어디에 응용할까?

자, 그러면 이 tmux를 어디에 응용할 것인가? 나는 개인적으로 다음의 두 가지 때문에 tmux를 사용하게 되었다.

딥러닝에의 응용

딥러닝 서버 혹은 딥러닝 학습을 위한 컨테이너를 운영한다면, 그 서버/컨테이너에 터미널로 원격 접속할 일이 많다.

예를들면 이렇다.

  1. 원격 서버/컨테이너에 딥러닝 학습을 수행
  2. 학습을 위한 데이터 이동

이 작업들의 공통점은 시간이 오래 걸리기 때문에 접속 상태를 장시간 유지해야 한다는 것이다. 처음엔 vscode로 이런 작업들을 수행했었는데, 학습 과정이 며칠을 넘어가다보니 client PC를 항상 연결한 채로 유지해야 한다는 문제가 있었다. 또한, 정전 등으로 client PC가 꺼지기라도 하면 학습이 중간에 중단될 수도 있다. 그리고 알 수 없는 이유로 vscode는 그냥 꺼지기도 한다.

이런 문제는 tmux를 사용한다면 깔끔하게 해결할 수 있다.

  1. ssh로 서버/컨테이너에 연결한다.
  2. 서버/컨테이너에서 tmux session을 생성하고, 원하는 만큼 window를 생성한다.
  3. 학습 스크립트를 실행한다.
  4. Host pc에서 ssh 연결을 종료한다.
  5. 학습을 끝났을 때쯤 ssh로 접속하고 tmux에 attach한다.
  6. 결과를 확인한다.

ssh에의 응용

이 경우도 딥러닝에의 응용과 유사하다. ssh로 서버에서 작업을 할 때, 여러 터미널을 사용해야할 때가 있다. 물론, host PC에서 필요한 만큼 nn개의 ssh 연결을 해도 된다. 그러나, 깔끔하지 않다…

Tmux를 쓰면 다음처럼 하면 된다.

  1. ssh로 서버에 연결한다.
  2. tmux session을 생성하고, 원하는 만큼 window를 생성한다.
  3. 각 window에서 하나씩의 작업을 담당하도록 한다.
  4. 모든 작업이 끝났으면 tmux session을 종료한다.
  5. ssh를 종료한다.

마치며

오늘은 linux 생활을 윤택하게 해주는 tmux를 다루었다. 정말 유용하니, 익혀서 꼭 사용을 해보자.

Last updated on