SSH 연결이 끊기면(노트북을 덮거나, 와이파이 끊김, VPN 타임아웃) 터미널에 붙어 있던 셸과 프로세스가 통째로 죽는다. nohup/disown으로 프로세스는 살릴 수 있어도 다시 접속해서 출력을 보거나 개입할 방법은 없다. tmux(terminal multiplexer)는 터미널 세션을 SSH 연결과 분리된 프로세스로 서버에 띄워, 끊기든 detach하든 백그라운드에서 계속 살아있게 한다. 이 글에서는 세션/윈도우/페인 개념, .tmux.conf 커스터마이징, 작업 환경을 스크립트로 자동 구성하는 방법을 정리한다.
핵심 개념
tmux는 세션(session) → 윈도우(window) → 페인(pane) 3단계 계층이다. 모든 명령은 prefix 키(기본 Ctrl+b)를 누른 뒤 이어서 입력한다.
| 개념 | 설명 | 비유 |
|---|---|---|
| 세션(session) | 독립적으로 attach/detach 가능한 최상위 단위. SSH 연결이 끊겨도 서버에서 계속 실행 | 브라우저 창 하나 |
| 윈도우(window) | 세션 안의 탭 | 브라우저 탭 |
| 페인(pane) | 윈도우를 가로/세로로 분할한 영역 | 탭 안의 분할 화면 |
세션 생성과 재연결
# 이름을 지정해 새 세션 시작
tmux new-session -s work
# 현재 세션에서 분리 (프로세스는 백그라운드에서 계속 실행)
# 세션 안에서: Ctrl+b, d
tmux ls # 실행 중인 세션 목록
tmux attach -t work # 이름으로 재접속
tmux kill-session -t work # 강제 종료
접속할 때마다 tmux attach || tmux new-session을 .bashrc에 넣어두면 기존 세션에 자동으로 붙거나 없으면 새로 만든다.
윈도우와 페인 다루기
| 동작 | 단축키(prefix 이후) |
|---|---|
| 새 윈도우 생성 | c |
| 다음/이전 윈도우로 이동 | n / p |
| 윈도우 번호로 바로 이동 | 0~9 |
| 페인 세로 분할 | % |
| 페인 가로 분할 | " |
| 페인 간 이동 | 방향키 |
| 페인 닫기 | x |
.tmux.conf로 커스터마이징
# prefix 키를 Ctrl+b에서 Ctrl+a로 변경
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# 페인 분할 단축키를 직관적인 기호로 변경
unbind %
bind | split-window -h
unbind '"'
bind - split-window -v
# 마우스로 페인 크기 조절, 스크롤 지원
set -g mouse on
# 윈도우/페인 번호를 1부터 시작 (0은 누르기 불편)
set -g base-index 1
setw -g pane-base-index 1
# 세션 히스토리(스크롤백) 라인 수 늘리기
set -g history-limit 10000
# 설정 리로드 단축키 (prefix + r)
bind r source-file ~/.tmux.conf \; display "tmux.conf reloaded"수정 후 prefix + r 또는 tmux source-file ~/.tmux.conf로 새 세션 없이 바로 적용된다.
스크립트로 작업 환경 자동화
매번 윈도우/페인을 나누고 명령을 띄우는 게 반복이면 스크립트로 자동화한다. -d로 백그라운드 세션을 만들고 send-keys로 각 윈도우/페인에 명령을 주입한다.
#!/usr/bin/env bash
set -euo pipefail
SESSION="dev"
PROJECT_DIR="/home/noble/myproject"
# 이미 같은 이름의 세션이 있으면 그대로 붙기만 하고 종료
if tmux has-session -t "$SESSION" 2>/dev/null; then
tmux attach -t "$SESSION"
exit 0
fi
tmux new-session -d -s "$SESSION" -n editor -c "$PROJECT_DIR"
tmux send-keys -t "$SESSION:editor" 'vim .' C-m
# 두 번째 윈도우: 서버와 로그를 위/아래 페인으로 분할
tmux new-window -t "$SESSION" -n server -c "$PROJECT_DIR"
tmux send-keys -t "$SESSION:server" './run_server.sh' C-m
tmux split-window -v -t "$SESSION:server" -c "$PROJECT_DIR"
tmux send-keys -t "$SESSION:server.1" 'tail -f logs/app.log' C-m
# 세 번째 윈도우: 시스템 모니터링
tmux new-window -t "$SESSION" -n monitor
tmux send-keys -t "$SESSION:monitor" 'htop' C-m
tmux select-window -t "$SESSION:editor"
tmux attach -t "$SESSION"$ ./setup-dev-session.sh
$ tmux ls
dev: 3 windows (created Mon Jul 20 10:12:03 2026)
send-keys의 마지막 인자 C-m은 엔터를 의미한다 — 빠뜨리면 명령 문자열만 입력되고 실행되지 않는다. 더 복잡한 프로젝트별 레이아웃은 tmuxinator/tmuxp로 YAML 선언 관리도 가능하다(내부적으로 같은 send-keys 방식).
주의사항
send-keys로 이전 명령이 끝나기 전에 다음 명령이 들어가면 프롬프트가 꼬일 수 있다 —sleep이나 완료 신호 파일 체크로 대응.- 세션은 서버 재부팅 시 사라진다 — 자동 복구하려면
tmux-resurrect/tmux-continuum. - detach 대신 터미널 창을 그냥 닫으면 세션이 백그라운드에 남는 경우가 많다 —
tmux ls로 방치된 세션 가끔 확인. - SSH
ServerAliveInterval미설정 시 방화벽/NAT 타임아웃으로 재접속 자체가 오래 걸릴 수 있다. - 페인은 화면당 2~4개 정도로 — 더 필요하면 윈도우 분리.
마무리
기본 명령(new-session, detach, attach) 몇 개만 익혀도 원격 작업 안정성이 크게 올라간다. .tmux.conf로 단축키를 다듬고 send-keys 스크립트로 접속할 때마다의 세팅 시간을 없앨 수 있다.