treeru.com
CLAUDE CODE

Tmux + Claude Code — SSH 끊겨도 AI가 계속 일하는 환경 만들기

2026-03-29
Treeru

Claude Code를 SSH로 원격 서버에서 쓰다 보면 반드시 마주치는 문제가 있습니다. 네트워크가 끊기면 Claude 세션도 같이 죽습니다.노트북 뚜껑을 닫거나, 잠깐 와이파이가 끊기거나, Windows Terminal 창을 실수로 닫으면 그때까지 진행하던 작업이 전부 사라집니다. 재실행하면 컨텍스트도 초기화됩니다. tmux를 사이에 끼우면 이 문제가 해결됩니다. SSH 연결과 무관하게 세션이 서버에 남아 있고, 다시 접속하면 떠났던 자리 그대로 이어서 작업할 수 있습니다. 이 글에서는 실제로 여러 대 서버에 배포해서 쓰고 있는 tmux 설정과 자동화 스크립트를 전부 공개합니다.

15대

배포된 서버 수

tmux 3.4

사용 버전

3패널

최대 동시 Claude 수

0줄

SSH 재접속 후 잃어버린 작업

SSH 끊김 = Claude 작업 소멸

기존 방식의 흐름은 단순합니다.

Windows Terminal → SSH 접속 → claude 실행 → 작업

이 구조에서 SSH 연결은 프로세스 생명주기와 직결됩니다. SSH 세션이 끊기는 순간 그 안에서 실행 중이던 모든 프로세스에 SIGHUP 신호가 전달되고, claude 프로세스도 종료됩니다. 진행 중이던 파일 수정이나 분석 작업이 중간에 끊립니다.

노트북 뚜껑 닫음 → SSH 끊김 → Claude 세션 소멸

와이파이 잠깐 끊김 → SSH timeout → 진행 중 작업 소실

터미널 창 실수로 닫음 → 컨텍스트 포함 전부 초기화

오래 걸리는 작업일수록, 그리고 서버 대수가 많을수록 이 문제가 자주 발생합니다. 대규모 리팩토링이나 코드 분석처럼 Claude가 여러 파일을 순서대로 처리해야 하는 작업은 중간에 끊기면 다시 처음부터 지시해야 합니다.

tmux가 해결하는 방식

tmux는 터미널 멀티플렉서입니다. 핵심 개념은 하나입니다. 터미널 프로세스를 SSH 연결과 분리합니다.

Windows Terminal → SSH 접속 → tmux 세션 → Claude 실행

tmux 세션은 SSH 연결이 아닌 서버 프로세스로 살아있습니다. SSH가 끊겨도 tmux 세션은 서버에 그대로 남아 있습니다. 다시 SSH로 접속해서 tmux attach를 실행하면 Claude가 작업하던 그 화면이 그대로 나타납니다.

tmux 세션 생명주기

생성: tmux new -s 세션이름 → 서버에 독립 프로세스로 상주
분리: Ctrl+b → d 또는 SSH 끊김 → 세션 유지됨
복귀: tmux attach -t 세션이름 → 그대로 이어서 작업
종료: exit 또는 tmux kill-session → 세션 삭제

언제 tmux를 쓰고 언제 안 쓰는가

tmux가 항상 필요한 것은 아닙니다. 작업 성격에 따라 구분해서 씁니다.

방식용도예시
직접 실행 (인스턴트)일회성 빠른 작업파일 하나 수정, 짧은 질문
tmux 세션연속·장시간 작업리팩토링, 배포 자동화, 복잡한 분석
tmux 멀티패널독립 작업 병렬 처리Claude 여러 개를 동시에 각각 다른 작업 지시

별도 alias도 구분해서 씁니다. c는 Claude Code 즉시 실행, cc는 대화 히스토리 조회용입니다.

alias c="command claude --dangerously-skip-permissions"
alias cc="claude-history"

.tmux.conf 전체 설정

아래는 실제로 배포해서 쓰고 있는 ~/.tmux.conf 전체 내용입니다. 각 항목마다 이유가 있습니다. 특히 escape-time은 아래 시행착오 섹션에서 자세히 다룹니다.

set -g default-terminal "xterm-256color"
set -sg escape-time 50
set -g history-limit 100000
set -g set-clipboard on
set -g allow-passthrough off
set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on
set -g mouse on
set -g status-left '[#S] '
set -g status-right '%H:%M %Y-%m-%d'
set -g status-style 'bg=colour235,fg=colour250'
setw -g monitor-activity on
set -g visual-activity off

주요 항목 설명

escape-time 50OSC 응답 시퀀스 처리 시간. 0으로 설정하면 Windows Terminal과 조합 시 색상 코드 문자열이 터미널에 출력됩니다.
allow-passthrough off터미널 패스스루 차단. OSC 11 관련 이스케이프 시퀀스 노이즈 방지.
history-limit 100000Claude가 긴 출력을 내보낼 때 스크롤백으로 확인할 수 있도록 크게 설정.
mouse on마우스로 패널 크기 조절 및 스크롤 가능.
base-index 1창 번호를 0이 아닌 1부터 시작. 키보드 숫자키와 자연스럽게 일치.

tmux-claude 자동화 스크립트

매번 세션 생성 → claude 실행 → 패널 분할을 수동으로 하는 것은 번거롭습니다. 아래 스크립트를 /usr/local/bin/tmux-claude에 배치하면 하나의 명령으로 원하는 환경이 만들어집니다. 경로를 /usr/local/bin/으로 선택한 이유는 SSH 명령 직접 실행 시 .bashrc가 로드되지 않아도 시스템 PATH에서 찾을 수 있기 때문입니다. (아래 시행착오 참고)

#!/bin/bash
SESSION="${1:-ai}"
DIR="${2:-~/ai}"
PANES="${3:-1}"

if tmux has-session -t "$SESSION" 2>/dev/null; then
    tmux attach -t "$SESSION"
else
    tmux new -s "$SESSION" -d -c "$DIR"
    tmux send-keys -t "$SESSION" 'c' Enter
    for ((i=2; i<=PANES; i++)); do
        tmux split-window -h -t "$SESSION" -c "$DIR"
        tmux send-keys -t "$SESSION" 'c' Enter
        tmux select-layout -t "$SESSION" even-horizontal
    done
    tmux attach -t "$SESSION"
fi

동작 방식

세션이 이미 존재하면 → 기존 세션에 attach (재접속 시에도 동일 명령 사용 가능)
세션이 없으면 → 새 세션 생성, Claude 자동 실행, 지정한 패널 수만큼 분할
패널이 여러 개면 → 각 패널에 독립적으로 Claude 실행 후 균등 레이아웃 적용

사용 예시

# 기본 (세션명 ai, AI 워크스페이스 디렉토리, 1패널)
tmux-claude

# 세션명 지정
tmux-claude dev ~/project

# 3패널 분할 (Claude 3개 동시 실행)
tmux-claude ai ~/ai 3

Windows에서 원클릭 실행

Windows Terminal에서 bat 파일로 SSH 접속 + tmux 세션 진입을 한 번에 처리할 수 있습니다. 자주 쓰는 서버별로 bat 파일을 만들어두면 아이콘 더블클릭 하나로 Claude 환경이 열립니다.

단일 패널

@echo off
wt nt cmd /k ssh -t 메인서버 "tmux-claude ai ~/ai"

3패널 분할 (Claude 3개 동시 실행)

@echo off
wt nt cmd /k ssh -t 메인서버 "tmux-claude ai ~/ai 3"

주의: SSH 명령에 -t 옵션이 반드시 필요합니다. tmux는 TTY(의사 터미널)를 요구하는데, SSH 명령 직접 실행 시 기본적으로 non-interactive 모드가 됩니다.-t를 붙여야 tmux가 정상 동작합니다.

필수 명령어 정리

세션 관리

명령설명
tmux new -s 이름세션 생성
tmux attach -t 이름세션 복귀 (재접속)
tmux ls현재 살아있는 세션 목록
tmux kill-session -t 이름세션 종료 (프로세스 포함)
tmux detach세션에서 빠져나오기 (세션 유지됨)

세션 안에서 (Ctrl+b 누른 후 손 떼고 다음 키)

동작
ddetach — 빠져나오기 (세션 유지)
c새 창 만들기
n / p다음 / 이전 창으로 이동
%세로 분할 (좌우)
"가로 분할 (상하)
방향키분할 패널 간 이동

exit vs detach — 가장 중요한 구분

  • exit: 세션 종료(kill). 안에서 실행 중이던 Claude를 포함해 전부 삭제됩니다. 돌아갈 수 없습니다.
  • Ctrl+b → d: 분리(detach). 세션은 서버에 살아있습니다. 나중에 attach로 돌아올 수 있습니다.

시행착오 기록

설정 과정에서 겪은 문제들을 기록합니다. 대부분 검색해도 나오지 않는 조합별 문제들이라 처음 맞닥뜨리면 원인 파악에 시간이 걸립니다.

1. OSC 색상 코드 문자열 출력 문제

증상: tmux 진입 시 ^[]11;rgb:0c0c/0c0c/0c0c 같은 문자열이 터미널에 출력됨

원인: Windows Terminal이 터미널 배경색 쿼리(OSC 11)에 응답하는데, tmux가 이 응답을 텍스트로 화면에 표시함

시도했으나 실패한 방법들

# 시도 1: screen-256color + terminal-overrides Tc → 실패
set -g default-terminal "screen-256color"

# 시도 2: tmux-256color + focus-events 제거 → 실패
set -g default-terminal "tmux-256color"

# 시도 3: terminal-overrides 전부 제거 → 실패

최종 해결

set -g default-terminal "xterm-256color"
set -sg escape-time 50        # 핵심: 0이면 안 됨
set -g allow-passthrough off  # 패스스루 차단

핵심 원인: escape-time 0으로 설정하면 tmux가 OSC 응답 시퀀스를 처리할 시간이 없어서 그대로 화면에 출력됩니다. 50ms로 올리면 tmux가 해당 시퀀스를 받아서 처리하고 화면에 노출하지 않습니다. 응답 빠른 환경을 위해 escape-time을 0으로 설정하는 가이드들이 많은데, Windows Terminal과 조합하면 이 문제가 생깁니다.

2. Claude Code 설치 스크립트 sh vs bash 문제

증상: curl ... | sh 실행 시 Syntax error: (( unexpected

원인: Ubuntu의 /bin/sh는 dash인데, Claude Code 설치 스크립트가 bash 전용 문법((( 등)을 사용함

# 이렇게 하면 안 됩니다
curl -fsSL https://claude.ai/install.sh | sh

# 반드시 bash로 지정
curl -fsSL https://claude.ai/install.sh | bash

3. SSH non-interactive 모드에서 명령어 못 찾음

증상: ssh 서버 "tmux-claude ..." 실행 시 “명령어를 찾을 수 없음”

원인: SSH로 명령을 직접 실행하면 non-interactive, non-login 셸이 열려서 .bashrc가 로드되지 않습니다. ~/.local/bin 같은 사용자 PATH가 없는 상태.

해결: 스크립트를 /usr/local/bin/에 배치. 시스템 기본 PATH에 포함되어 있어 항상 찾을 수 있습니다.

4. tmux.conf 수정 후 변화 없음

증상: ~/.tmux.conf를 수정했는데 tmux 동작이 바뀌지 않음

원인: 기존 tmux 서버 프로세스가 살아있어서 새 설정을 읽지 않음

해결: tmux kill-server로 서버 완전 종료 후 다시 시작. tmux source-file ~/.tmux.conf는 일부 설정만 반영됩니다.

5. Claude 버전 우선순위 충돌

증상: 네이티브 설치 후에도 구 버전 Claude가 실행됨

원인: npm으로 설치한 심볼릭 링크(/usr/bin/claude)가 네이티브 설치 경로(/usr/local/bin/claude)보다 PATH 우선순위가 높음

해결: /usr/bin/claude 심볼릭 링크 삭제 또는 올바른 경로로 재설정

6. 세션 이름에 한글 또는 특수문자 사용

증상: tmux new -s claude-작업명 실행 시 에러

해결: tmux 세션 이름은 영문자 + 숫자 + 하이픈(-) + 언더스코어(_)만 사용합니다. ai1, dev-01처럼 짧고 명확하게 짓습니다.

다수 서버 일괄 배포 방법

여러 대 서버를 운영하는 경우 각 서버에 개별 접속해서 설정하는 것은 비효율적입니다. scp와 ssh를 반복문으로 묶어서 백그라운드 병렬 실행하면 전체 배포가 몇 초 안에 끝납니다.

.tmux.conf 배포

for server in 서버1 서버2 서버3; do
  scp -q ~/.tmux.conf ${server}:~/.tmux.conf &
done
wait

tmux-claude 스크립트 배포

for server in 서버1 서버2 서버3; do
  scp -q /usr/local/bin/tmux-claude ${server}:/tmp/tmux-claude
  ssh ${server} "sudo cp /tmp/tmux-claude /usr/local/bin/tmux-claude && sudo chmod +x /usr/local/bin/tmux-claude" &
done
wait

&로 백그라운드에 던지고 마지막에 wait로 전체 완료를 기다립니다. 서버가 많아도 병렬 처리되므로 가장 오래 걸리는 서버 시간만큼만 소요됩니다. 배포 후 각 서버에서 tmux kill-server를 실행해야 새 설정이 적용됩니다.

마무리

tmux + Claude Code 조합은 설정이 단순한 만큼 효과가 즉각적입니다. SSH 끊김에 대한 불안 없이 긴 작업을 맡길 수 있고, 멀티패널로 Claude 여러 개를 동시에 띄워 독립적인 작업을 병렬 처리하는 것도 가능합니다.

설정에서 가장 주의할 점은 escape-time입니다. 많은 가이드에서 응답 속도를 위해 0으로 설정하라고 하지만, Windows Terminal과 조합하면 OSC 응답 문자열이 화면에 출력되는 문제가 생깁니다. 50ms가 적절한 값입니다.

tmux를 쓰면서 가장 달라진 점은 “지금 당장 이 작업을 끝내야 한다”는 압박이 없어졌다는 것입니다. 자리를 떠야 할 때 Ctrl+b → d로 빠져나오면 그만입니다. 다시 돌아왔을 때 Claude는 그 자리에서 기다리고 있습니다.

관련 글

T

Treeru

웹 개발, IT 인프라, AI 솔루션 분야의 실무 인사이트를 공유합니다. 기업의 디지털 전환을 돕는 IT 파트너, Treeru입니다.

공유

댓글

(4)
4.75/ 5

로그인 하면 댓글을 작성할 수 있습니다.

2026-03-29
555.0

SSH 연결이 불안정한 환경에서 tmux 없이 작업하다가 진짜로 몇 번 날렸습니다. tmux-claude 스크립트가 세션 이미 있으면 attach하는 로직이 깔끔하네요.

2026-03-29
555.0

escape-time 0이 OSC 응답 씹는 문제 원인인 줄 몰랐습니다. 저도 이 문제로 한참 고생했는데, 50ms로 올리는 게 핵심이었군요.

2026-03-29
454.0

3패널 스플릿으로 Claude 3개 동시에 돌리는 건 생각을 못 했네요. 독립적인 태스크를 병렬로 처리하면 속도가 많이 올라갈 것 같습니다.

관련 글

© 2026 TreeRU. All rights reserved.

본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.