tmux: 터미널 멀티플렉서의 정석
SSH로 원격 서버에 접속해서 배포 스크립트를 돌리고 있는데 갑자기 인터넷이 끊겼습니다. 다시 접속해보니 실행하던 프로세스가 사라져 있어요. 처음부터 다시 해야 합니다. 😅
이런 경험, 서버 작업을 해보신 분이라면 한 번쯤 겪어보셨을 거예요. 아니면 터미널 탭을 10개쯤 열어놓고 “아까 그 로그 보던 탭이 어디였지?” 하고 헤매본 적도 있으실 테고요.
tmux는 이 두 가지 문제를 한 번에 해결해주는 터미널 멀티플렉서입니다. 1987년 GNU Screen에서 시작된 터미널 멀티플렉서의 계보를 잇는 도구로, 2007년에 처음 등장한 이래 서버 관리자와 개발자들 사이에서 사실상 표준으로 자리 잡았어요. BSD 라이선스라 누구나 무료로 쓸 수 있고, 거의 모든 리눅스/유닉스 서버에 깔려 있습니다.
터미널 멀티플렉서가 뭔가요?
터미널 멀티플렉서는 터미널 하나에서 터미널 세션 여러 개를 동시에 돌리고 관리해주는 도구입니다.
핵심 기능은 두 가지예요.
첫째, 화면 분할입니다. 터미널 창 하나를 가로세로로 나눠서 여러 작업을 동시에 볼 수 있어요. 왼쪽에서 코드를 편집하면서 오른쪽에서 서버 로그를 확인하고, 아래쪽에서 테스트를 돌리는 식이죠.
둘째, 세션 유지입니다. 터미널을 닫거나 SSH 연결이 끊어져도 세션이 서버에서 계속 살아있어요. 나중에 다시 접속해서 세션에 붙으면 끊기기 전 상태 그대로 이어서 작업할 수 있습니다. 글 서두에서 말한 “배포 중에 인터넷이 끊기는” 문제가 바로 이 기능으로 해결되는 거예요.
tmux 설치
macOS에서는 Homebrew로 설치합니다.
$ brew install tmux
Ubuntu/Debian 계열 리눅스에서는 apt를 씁니다.
$ sudo apt update
$ sudo apt install tmux
Arch 리눅스는 pacman으로 간단하게 됩니다.
$ sudo pacman -S tmux
설치가 끝나면 버전을 확인해보세요.
$ tmux -V
tmux 3.5
세션, 윈도우, 패널
tmux를 이해하려면 세 가지 계층만 잡으면 됩니다.
세션(Session)은 tmux의 최상위 단위예요. 프로젝트 하나당 세션 하나를 만들어 쓰는 식이죠.
윈도우(Window)는 브라우저 탭이랑 비슷합니다. 여러 개 만들어서 전환해가며 쓰면 돼요. “에디터” 윈도우, “서버” 윈도우, “로그” 윈도우 이런 식으로 나누면 됩니다.
패널(Pane)은 윈도우 안을 쪼갠 영역이에요. 가로세로로 나눠서 여러 터미널을 한눈에 볼 수 있죠.
세션 "my-project"
├── 윈도우 0: "editor"
│ ├── 패널 0: vim
│ └── 패널 1: 터미널
├── 윈도우 1: "server"
│ └── 패널 0: npm run dev
└── 윈도우 2: "logs"
├── 패널 0: tail -f app.log
└── 패널 1: tail -f error.log
이 구조를 머릿속에 그려두면 tmux의 명령어가 금방 감이 잡힙니다.
프리픽스 키
tmux의 단축키에는 한 가지 규칙이 있어요. 거의 모든 단축키 앞에 프리픽스 키를 먼저 눌러야 합니다.
기본 프리픽스는 Ctrl+b입니다.
Ctrl+b를 누르고 손을 뗀 다음 명령 키를 누르는 방식이에요.
예를 들어 새 윈도우를 만들려면 Ctrl+b를 누르고 c를 누릅니다.
이 글에서는 프리픽스를 Ctrl+b로 표기하겠습니다.
Ctrl+b c는 “프리픽스를 누르고 c를 누른다”는 뜻이에요.
처음에는 매번 프리픽스를 누르는 게 번거롭게 느껴질 수 있는데, 이렇게 하면 일반 터미널 단축키와 충돌하지 않아서 안전합니다.
나중에 설정에서 Ctrl+a 같은 더 편한 키로 바꿀 수도 있고요.
세션 관리
tmux를 시작해볼까요?
터미널에서 tmux를 입력하면 새 세션이 만들어집니다.
$ tmux
화면 하단에 초록색 상태바가 나타나면 tmux 안에 들어온 거예요. 이름을 지정해서 세션을 만들 수도 있습니다.
$ tmux new -s my-project
세션 안에서 작업을 하다가 밖으로 나가고 싶을 때는 분리(detach)를 합니다.
Ctrl+b d
분리하면 tmux 화면에서 빠져나오지만 세션은 백그라운드에서 계속 살아있어요. 실행 중이던 프로세스도 그대로 돌아가고 있습니다.
다시 세션에 붙으려면 attach 명령을 씁니다.
$ tmux attach -t my-project
줄여서 tmux a -t my-project라고 쳐도 됩니다.
실행 중인 세션 목록을 확인하려면 이렇게 하면 돼요.
$ tmux ls
my-project: 1 windows (created Mon Mar 2 10:00:00 2026)
세션을 아예 종료하고 싶으면 kill 명령을 씁니다.
$ tmux kill-session -t my-project
tmux 안에서 세션 목록을 보면서 전환할 수도 있는데요.
Ctrl+b s를 누르면 세션 목록이 나타나고 방향키로 골라서 바로 전환하면 돼요.
SSH와 tmux 조합
tmux가 가장 빛나는 순간은 원격 서버에서 작업할 때입니다.
# 서버에 SSH로 접속
$ ssh user@remote-server
# tmux 세션을 만들어서 작업 시작
$ tmux new -s deploy
# 배포 스크립트 실행
$ ./deploy.sh
이 상태에서 SSH 연결이 끊어져도 deploy.sh는 tmux 세션 안에서 계속 돌아가고 있어요.
나중에 다시 접속해서 세션에 붙으면 됩니다.
$ ssh user@remote-server
$ tmux attach -t deploy
이 워크플로우가 몸에 배면 서버에서 뭔가를 실행할 때 항상 tmux 안에서 하게 됩니다. ML 모델 학습처럼 몇 시간씩 걸리는 작업도 안심하고 돌려놓을 수 있고, 퇴근 전에 세션을 분리해두고 다음 날 출근해서 다시 붙으면 진행 상황을 바로 확인할 수 있거든요.
윈도우 관리
세션 안에서 여러 윈도우를 만들어서 작업을 나눠담으면 됩니다. 브라우저 탭이랑 비슷한 개념이에요.
Ctrl+b c— 새 윈도우 생성Ctrl+b ,— 현재 윈도우 이름 변경Ctrl+b n— 다음 윈도우로 이동Ctrl+b p— 이전 윈도우로 이동Ctrl+b 0~9— 번호로 윈도우 이동Ctrl+b w— 윈도우 목록 보기 (방향키로 선택)Ctrl+b &— 현재 윈도우 닫기 (확인 후)
Ctrl+b w가 특히 편리해요.
모든 세션과 윈도우를 트리 형태로 보여주기 때문에 어디에 뭐가 있는지 한눈에 파악되고 바로 이동할 수 있어요.
윈도우 이름은 Ctrl+b ,로 꼭 지정해두는 게 좋습니다.
이름 없이 숫자만 보이면 나중에 윈도우가 많아졌을 때 헷갈리거든요.
패널 관리
패널은 윈도우를 여러 영역으로 쪼개는 기능입니다. tmux에서 가장 자주 쓰게 되는 기능이에요.
Ctrl+b %— 세로 분할 (좌우로 나눔)Ctrl+b "— 가로 분할 (상하로 나눔)Ctrl+b 방향키— 패널 간 이동Ctrl+b z— 패널 확대/축소 토글Ctrl+b x— 현재 패널 닫기 (확인 후)Ctrl+b Space— 레이아웃 순환 변경Ctrl+b q— 패널 번호 표시 (번호를 눌러 이동)
세로 분할(%)은 화면 가운데에 세로선이 생기면서 왼쪽/오른쪽 두 영역이 만들어지고, 가로 분할(")은 가로선이 생기면서 위/아래 두 영역이 만들어져요.
Ctrl+b z는 진짜 자주 쓰게 됩니다.
패널이 여러 개로 나뉘어 있으면 각 패널이 작아서 내용을 보기 어려울 때가 있거든요.
이 단축키를 누르면 현재 패널이 전체 화면으로 확대되고, 다시 누르면 원래 레이아웃으로 돌아옵니다.
로그를 자세히 보고 싶을 때나 코드를 집중해서 읽을 때 유용해요.
패널 크기를 세밀하게 조절하고 싶으면 Ctrl+b를 누른 상태에서 방향키를 누르면 됩니다.
정확히는 Ctrl+b를 누르고 손을 뗀 다음 Ctrl+방향키를 누르는 건데, 살짝 불편합니다.
나중에 설정에서 더 편한 키로 바꿀 수 있으니 지금은 넘어가겠습니다.
Copy 모드
tmux 안에서 화면을 스크롤하거나 텍스트를 복사하려면 Copy 모드를 써야 해요.
Ctrl+b [
Copy 모드에 들어가면 방향키나 PgUp/PgDn으로 화면을 스크롤할 수 있어요.
이전에 지나간 출력 결과를 다시 보고 싶을 때 필요한 기능입니다.
Copy 모드에서 q를 누르면 빠져나옵니다.
Copy 모드에서는 검색도 가능해요.
/를 누르고 검색어를 입력하면 앞으로 검색하고, ?는 뒤로 검색합니다.
Vim의 검색과 완전히 같은 방식이라 Vim에 익숙하신 분은 바로 쓸 수 있을 거예요.
텍스트를 복사하려면 Copy 모드에서 Space로 선택을 시작하고 방향키로 범위를 지정한 다음 Enter를 눌러 복사합니다.
Ctrl+b ]로 붙여넣을 수 있고요.
이 동작은 나중에 설정에서 vi 스타일 단축키로 바꾸면 훨씬 편해집니다.
tmux 설정하기
tmux의 기본 설정도 나쁘지 않지만, 몇 가지를 바꾸면 체감이 확 달라집니다.
설정 파일은 ~/.tmux.conf에 만들면 돼요.
# 프리픽스를 Ctrl+a로 변경
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# 마우스 지원 활성화
set -g mouse on
# 윈도우 번호를 1부터 시작
set -g base-index 1
setw -g pane-base-index 1
# 윈도우를 닫으면 번호를 재정렬
set -g renumber-windows on
# 스크롤 버퍼 크기 늘리기
set -g history-limit 10000
# Escape 키 지연 제거 (Vim 사용자 필수)
set -sg escape-time 0
# 256 색상 지원
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",xterm-256color:Tc"
# 직관적인 분할 단축키
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %
# 새 윈도우도 현재 디렉토리에서 열기
bind c new-window -c "#{pane_current_path}"
# Vim 스타일 패널 이동
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# 프리픽스 없이 Alt+방향키로 패널 이동
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
# 패널 크기 조절
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
# 셸이 윈도우 이름을 덮어쓰지 못하게 고정
set -g allow-rename off
# 설정 파일 다시 불러오기
bind r source-file ~/.tmux.conf \; display "설정을 다시 불러왔습니다!"
# Copy 모드에서 vi 스타일 단축키 사용
setw -g mode-keys vi
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
하나씩 살펴보면요.
프리픽스를 Ctrl+a로 바꾸는 건 거의 관례처럼 된 설정입니다.
Ctrl+b는 왼손으로 누르기 어색한 조합인데 Ctrl+a는 왼손 새끼손가락과 약지로 자연스럽게 누를 수 있어요.
GNU Screen에서 넘어온 사용자들에게도 익숙한 조합이고요.
여기에 운영체제 설정에서 Caps Lock을 Ctrl로 리매핑하면 새끼손가락의 부담이 훨씬 줄어듭니다.
macOS는 시스템 설정의 키보드 > 수정자 키에서, 리눅스는 setxkbmap이나 GNOME Tweaks에서 바꿀 수 있어요.
set -g mouse on은 마우스로 패널을 클릭해서 이동하거나 패널 경계를 드래그해서 크기를 조절할 수 있게 해줍니다.
tmux가 처음이라면 이 설정을 켜두는 게 편해요.
분할 단축키를 |와 -로 바꾸는 것도 인기 있는 설정입니다.
%와 "보다 어떤 방향으로 나뉘는지 직관적으로 알 수 있으니까요.
-c "#{pane_current_path}"는 새로 만들어지는 패널이 현재 디렉토리에서 시작하도록 해주는 옵션인데, 이걸 안 해두면 tmux를 처음 시작한 디렉토리에서 열려서 매번 cd를 해야 합니다.
escape-time 0은 Vim이나 NeoVim을 tmux 안에서 쓸 때 필수적인 설정이에요.
이걸 안 하면 Esc를 눌렀을 때 미세한 딜레이가 생겨서 Vim에서 모드 전환이 답답해집니다.
설정 파일을 수정했으면 tmux를 재시작하거나, tmux 안에서 Ctrl+a r(위 설정을 적용한 경우)을 누르면 바로 반영됩니다.
개발 환경 스크립트 만들기
매번 tmux를 켜고 윈도우를 만들고 패널을 분할하고 명령어를 실행하는 건 귀찮죠. 셸 스크립트로 자동화하면 됩니다.
#!/bin/bash
SESSION="my-project"
# 세션이 이미 존재하면 붙기
tmux has-session -t $SESSION 2>/dev/null
if [ $? -eq 0 ]; then
tmux attach -t $SESSION
exit 0
fi
# 새 세션 생성 (첫 번째 윈도우: editor)
tmux new-session -d -s $SESSION -c ~/projects/my-project
tmux rename-window -t $SESSION:1 "editor"
tmux send-keys -t $SESSION:1 "vim ." Enter
# 두 번째 윈도우: server
tmux new-window -t $SESSION -n "server"
tmux send-keys -t $SESSION:2 "npm run dev" Enter
# 세 번째 윈도우: tools (패널 분할)
tmux new-window -t $SESSION -n "tools"
tmux split-window -h -t $SESSION:3
tmux send-keys -t $SESSION:3.0 "tail -f logs/app.log" Enter
tmux send-keys -t $SESSION:3.1 "npm test -- --watch" Enter
# 첫 번째 윈도우로 이동 후 세션에 붙기
tmux select-window -t $SESSION:1
tmux attach -t $SESSION
이 스크립트를 chmod +x dev.sh로 실행 권한을 준 다음 ./dev.sh를 실행하면 에디터, 개발 서버, 로그와 테스트가 한 번에 셋업됩니다.
세션이 이미 있으면 새로 만들지 않고 기존 세션에 붙도록 처리한 것도 포인트예요.
프로젝트마다 이런 스크립트를 하나씩 만들어두면 출근해서 터미널 열고 스크립트 한 줄로 바로 작업에 들어갑니다.
유용한 플러그인
tmux에도 플러그인 생태계가 있습니다. TPM(Tmux Plugin Manager)을 설치하면 플러그인을 편리하게 관리할 수 있어요.
$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
설치한 다음 ~/.tmux.conf에 플러그인을 추가합니다.
# TPM 플러그인 목록
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @plugin 'tmux-plugins/tmux-yank'
# TPM 초기화 (파일 맨 아래에 위치해야 함)
run '~/.tmux/plugins/tpm/tpm'
tmux-sensible은 대부분의 사용자가 동의할 만한 기본 설정을 모아놓은 플러그인이에요. 스크롤 버퍼 크기, 상태바 업데이트 주기 같은 것들을 적절한 값으로 맞춰줍니다.
tmux-resurrect는 tmux 환경 전체를 저장하고 복원하는 플러그인입니다.
Ctrl+a Ctrl+s로 저장하고 Ctrl+a Ctrl+r로 복원할 수 있어요.
컴퓨터를 재부팅해도 세션, 윈도우, 패널 배치가 그대로 살아납니다.
tmux-continuum은 resurrect를 자동화해서 15분마다 자동 저장해주고, tmux를 시작할 때 마지막 상태를 자동 복원할 수도 있어요.
tmux-yank는 tmux에서 복사한 텍스트를 시스템 클립보드와 연동해줍니다. 이걸 안 깔면 tmux 안에서 복사한 텍스트를 브라우저에 붙여넣을 수가 없어서 꽤 답답해요.
플러그인을 추가한 후 tmux 안에서 Ctrl+a I(대문자 I)를 누르면 플러그인이 설치됩니다.
초보자가 흔히 하는 실수
tmux를 처음 쓸 때 몇 가지 실수를 자주 하는데, 미리 알아두면 시간을 아낄 수 있어요.
프리픽스를 안 누르고 단축키만 누르는 실수가 제일 흔합니다.
c만 누르면 그냥 터미널에 c가 입력될 뿐이에요.
반드시 Ctrl+b(또는 설정을 바꿨으면 Ctrl+a)를 먼저 눌러야 합니다.
분리(detach)와 종료(exit)를 헷갈리는 것도 자주 보입니다.
Ctrl+b d는 세션을 살려두고 빠져나오는 거고, exit를 입력하거나 Ctrl+d를 누르면 패널이 완전히 닫힙니다.
세션의 마지막 패널이 닫히면 세션 자체도 사라져요.
“잠깐 나갔다 올게”는 Ctrl+b d, “이 패널 더 이상 안 써”는 exit입니다.
tmux 안인데 또 tmux를 치는 분도 있어요.
이미 tmux 안에 있는데 tmux를 입력하면 세션 안에 세션이 생기면서 프리픽스 키가 꼬입니다.
tmux 안에 있는지 확인하려면 화면 하단에 초록색 상태바가 있는지 보면 돼요.
다른 세션으로 가고 싶으면 tmux를 새로 실행하는 대신 Ctrl+b s로 세션 목록을 열어서 전환하세요.
세션에 이름을 안 붙이고 tmux만 입력하는 것도 나중에 혼란을 부릅니다.
이름 없는 세션은 0, 1, 2 같은 숫자로 구분되는데 세션이 많아지면 어느 게 뭔지 알 수가 없어요.
tmux new -s 이름 습관을 들이는 게 좋습니다.
마치며
tmux는 한 번 손에 익으면 없이는 못 살게 되는 도구입니다. SSH 연결이 끊어져도 작업이 보존되고, 화면을 자유자재로 분할해서 여러 작업을 동시에 관리할 수 있으니까요. 처음에는 프리픽스 키와 단축키가 어색하지만 며칠만 쓰면 자연스러워집니다.
tmux의 학습 곡선이 부담스럽다면 Zellij도 한번 살펴보세요. 화면 하단에 단축키가 항상 표시되어서 뭘 외우지 않아도 바로 쓸 수 있거든요. 반대로 tmux의 자유로운 설정과 어디서든 쓸 수 있는 범용성이 필요하다면 tmux가 더 맞을 거예요.
터미널 기반 개발 환경에 관심이 있다면 NeoVim과 함께 쓰는 걸 추천합니다. NeoVim으로 코드를 편집하면서 tmux로 터미널을 분할하면 마우스 없이도 쾌적하게 개발할 수 있거든요. 터미널 앱 자체를 바꿔보고 싶다면 Ghostty도 써보세요.
더 자세한 내용은 tmux 공식 GitHub 저장소를 참고하세요.
This work is licensed under
CC BY 4.0