Blog
claude-codecodextmuxai-agenttoken-optimizationdevops

tmux로 Claude Code·Codex 세션 끊김 없이 운영하기 — 그리고 토큰 관리

SSH가 끊겨도 Claude Code·Codex CLI 세션을 유지하는 tmux 구성(macOS·Linux·Windows WSL2)과, 오래 켜 둔 세션에서 토큰이 불어나는 이유와 관리 전략을 정리했습니다.

Data Dynamics2026년 10월 4일41 min read

원격 서버에서 Claude Code나 Codex CLI에게 리팩터링을 맡겨 두고 노트북을 덮었다가, 다시 열었을 때 SSH 세션과 함께 에이전트도 사라져 있던 경험이 한 번쯤 있을 겁니다. 에이전트 작업은 수십 분에서 몇 시간씩 걸리기 때문에 터미널 연결과 에이전트 프로세스의 수명을 분리하는 것이 먼저입니다.

이 글은 두 가지를 다룹니다.

  1. tmux로 세션을 유지하는 방법 — macOS·Linux 각각의 함정과 재부팅 대응까지
  2. 오래 유지되는 세션의 토큰 관리 — 세션을 켜 두는 것 자체는 공짜지만, 켜 둔 세션을 다시 쓰는 순간 비용이 커지는 이유와 대응책

컨텍스트 압축(compaction)의 원리 자체는 에이전트 메모리와 컴팩션, 컴팩션 심화에서 다뤘으므로 여기서는 운영 관점에 집중합니다.

1. 왜 연결이 끊기면 에이전트가 죽을까?

SSH로 접속해 실행한 프로세스는 SSH가 만든 셸의 자식입니다. 연결이 끊기면 셸이 SIGHUP을 받고, 그 신호가 자식 프로세스인 claude·codex까지 전달되어 함께 종료됩니다.

tmux는 이 구조를 바꿉니다. 프로세스의 부모가 SSH 셸이 아니라 백그라운드에서 도는 tmux 서버가 되고, 우리가 보는 터미널은 그 서버에 붙은 클라이언트일 뿐입니다. 클라이언트가 사라져도 서버와 그 안의 프로세스는 계속 실행합니다.

노트북 터미널에서 SSH로 원격 서버의 tmux 클라이언트에 연결하고, 연결이 끊겨도 백그라운드 tmux 서버와 Claude Code·Codex·로그 창이 계속 실행되는 구조

nohup이나 disown으로도 프로세스는 살릴 수 있습니다. 하지만 Claude Code·Codex는 대화형 TUI라서 다시 붙어서 화면을 보고 입력할 수 있어야 의미가 있습니다. 그래서 tmux(또는 screen)가 필요합니다.

2. 설치

# macOS (Homebrew)
brew install tmux
 
# Ubuntu / Debian
sudo apt-get install -y tmux
 
# RHEL / Rocky / Alma
sudo dnf install -y tmux
 
tmux -V   # 3.2 이상 권장 (extended-keys, OSC52 클립보드 등)

Windows에는 네이티브 tmux가 없습니다. WSL2의 Ubuntu 안에 tmux를 설치하고 에이전트도 WSL 안에서 실행하는 것이 사실상 표준이며, 자세한 설정은 6장의 Windows(WSL2) 절에서 다룹니다.

CentOS 7처럼 오래된 배포판의 기본 패키지는 tmux 1.8이어서 아래 설정 일부가 동작하지 않습니다. 이런 환경에서는 소스 빌드나 별도 저장소로 3.x를 설치하는 편이 낫습니다.

3. 기본 사용법

tmux new -s agent          # 'agent'라는 세션 생성 후 진입
claude                     # 세션 안에서 에이전트 실행
 
# Ctrl-b 를 누른 뒤 d  → detach (세션은 계속 돈다)
 
tmux ls                    # 살아 있는 세션 목록
tmux attach -t agent       # 다시 붙기 (줄여서 tmux a -t agent)
tmux kill-session -t agent # 세션 종료

자주 쓰는 키(접두키 Ctrl-b 다음에 입력):

키동작
ddetach
c새 window
n / p다음 / 이전 window
0~9번호로 window 이동
% / "세로 / 가로 분할
[스크롤(copy) 모드, q로 빠져나옴
s세션 목록에서 선택

SSH 접속과 attach를 한 번에 하려면 다음과 같이 씁니다. 세션이 없으면 만들고, 있으면 붙습니다.

ssh -t dev-server 'tmux new -A -s agent'

4. AI 에이전트용 .tmux.conf

기본 설정으로도 동작은 하지만, 에이전트 TUI는 출력이 길고 색·키 입력이 많아서 몇 가지를 조정하면 훨씬 편해집니다.

# ~/.tmux.conf
 
# 1) 스크롤백: 에이전트 출력이 길다 (기본 2000줄)
set -g history-limit 100000
 
# 2) ESC 지연 제거: TUI에서 Esc 반응이 느려지는 문제 방지
set -sg escape-time 0
 
# 3) 색상: 256색 + true color
set -g default-terminal "tmux-256color"
set -as terminal-features ",xterm-256color:RGB"
 
# 4) 수정 키 전달: Shift+Enter 등 조합키를 앱으로 넘김 (tmux 3.2+)
set -g extended-keys on
set -as terminal-features ",xterm*:extkeys"
 
# 5) 마우스 스크롤·선택
set -g mouse on
 
# 6) 클립보드: OSC52로 원격 tmux에서 복사한 내용을 로컬 클립보드로
set -g set-clipboard on
 
# 7) 포커스 이벤트, window 번호 1부터
set -g focus-events on
set -g base-index 1
setw -g pane-base-index 1
 
# 8) 활동 감지: 다른 window에서 에이전트가 출력/종료하면 상태바에 표시
setw -g monitor-activity on
set -g visual-activity off
tmux source-file ~/.tmux.conf   # 실행 중인 서버에 반영

설정별 참고 사항:

  • Shift+Enter 줄바꿈: Claude Code는 터미널에 따라 /terminal-setup으로 줄바꿈 키를 설정합니다. tmux 안에서는 위의 extended-keys 설정이 있어야 조합키가 전달됩니다. 그래도 안 되면 \ 다음에 Enter를 치는 방식이 어디서나 동작합니다.
  • 클립보드: macOS의 iTerm2·Ghostty·WezTerm, Linux의 대부분 최신 터미널은 OSC52를 지원합니다. iTerm2는 Settings → General → Selection → Applications in terminal may access clipboard를 켜야 합니다.
  • 마우스 모드: mouse on 상태에서 터미널 기본 선택을 쓰려면 macOS는 Option, Linux는 Shift를 누른 채 드래그합니다.

5. 프로젝트별 세션 자동 구성

매번 window를 손으로 만들지 말고, 프로젝트마다 "있으면 붙고, 없으면 만든다" 스크립트를 하나 둡니다.

#!/usr/bin/env bash
# ~/bin/agent-session : 사용법 agent-session <프로젝트 경로> [세션명]
set -euo pipefail
 
DIR="$(cd "${1:-.}" && pwd)"
NAME="${2:-$(basename "$DIR" | tr '.:' '__')}"
 
if ! tmux has-session -t "$NAME" 2>/dev/null; then
  tmux new-session  -d -s "$NAME" -n claude -c "$DIR"
  tmux send-keys    -t "$NAME:claude" 'claude --continue || claude' C-m
 
  tmux new-window   -t "$NAME" -n codex -c "$DIR"
  tmux send-keys    -t "$NAME:codex" 'codex resume --last || codex' C-m
 
  tmux new-window   -t "$NAME" -n shell -c "$DIR"
  tmux select-window -t "$NAME:claude"
fi
 
# 이미 tmux 안이면 switch, 밖이면 attach
if [ -n "${TMUX:-}" ]; then
  tmux switch-client -t "$NAME"
else
  tmux attach -t "$NAME"
fi
  • claude --continue는 해당 디렉터리의 가장 최근 대화를 이어 엽니다. codex resume --last도 가장 최근 세션을 이어 엽니다. 이전 대화가 없으면 || 뒤의 명령으로 새로 시작합니다.
  • 세션 이름을 프로젝트 이름으로 맞춰 두면 tmux ls만 봐도 어떤 에이전트가 어디서 돌고 있는지 바로 보입니다.

이어서 열기(--continue)가 항상 좋은 것은 아닙니다. 오래 묵은 대화를 이어 열면 토큰 비용이 커질 수 있습니다. 이 내용은 8장에서 다룹니다.

6. OS별 함정 — "tmux를 썼는데도 죽었다"

tmux는 SSH 끊김은 막아 주지만, OS가 프로세스를 정리하거나 재우는 것까지는 막지 못합니다.

Linux: systemd-logind가 tmux를 죽이는 경우

/etc/systemd/logind.conf에서 KillUserProcesses=yes이면, 사용자의 마지막 로그인 세션이 끝날 때 tmux 서버까지 포함해 그 사용자의 프로세스를 모두 종료합니다. 배포판 기본값은 대부분 no이지만, 보안 정책으로 켜 둔 서버가 있습니다.

# 현재 설정 확인
grep -i KillUserProcesses /etc/systemd/logind.conf
loginctl show-user "$USER" -p Linger

해결 방법은 둘 중 하나입니다.

# 방법 1) linger 활성화: 로그아웃 후에도 사용자 매니저와 프로세스 유지
sudo loginctl enable-linger "$USER"
 
# 방법 2) tmux를 로그인 세션 밖의 별도 scope로 띄우기
systemd-run --user --scope --unit=tmux-agent tmux new -d -s agent

부팅 직후부터 tmux 서버가 떠 있게 하려면 user 서비스로 등록합니다(linger 필요).

# ~/.config/systemd/user/tmux.service
[Unit]
Description=tmux default server
 
[Service]
Type=forking
ExecStart=/usr/bin/tmux new-session -d -s main
ExecStop=/usr/bin/tmux kill-server
Restart=on-failure
 
[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now tmux.service

그 밖의 점검 항목:

  • OOM Killer: 에이전트가 빌드·테스트를 병렬로 돌리다 메모리가 부족해지면 커널이 프로세스를 죽입니다. dmesg | grep -i oom으로 확인합니다.
  • 유휴 SSH 끊김: 방화벽·NAT가 유휴 연결을 끊는 문제는 tmux가 막아 주지만, 재접속을 줄이려면 클라이언트 ~/.ssh/config에 ServerAliveInterval 60을 넣습니다.

macOS: 잠자기가 진짜 적

원격 Linux 서버에 SSH로 붙는 경우에는 노트북이 잠들어도 서버 쪽 tmux와 에이전트는 계속 돕니다. 문제는 Mac 자체에서 에이전트를 돌리는 경우입니다. 덮개를 닫거나 시스템이 잠들면 tmux 안의 프로세스도 같이 멈추고, 네트워크가 끊겨 API 호출이 실패합니다.

# 이 명령이 떠 있는 동안 잠자기 방지 (디스플레이·유휴·시스템)
caffeinate -dimsu
 
# 특정 세션의 수명만큼만 깨어 있게: 에이전트를 caffeinate 아래에서 실행
caffeinate -i claude
 
# 전원 어댑터 연결 시 시스템 잠자기 끄기 (영구 설정)
sudo pmset -c sleep 0
pmset -g | grep -E 'sleep|displaysleep'
  • 덮개를 닫은 상태(clamshell)로 계속 돌리려면 전원과 외부 디스플레이가 연결돼 있어야 합니다. 아니면 System Settings → Battery → Options의 "디스플레이가 꺼져 있을 때 자동으로 잠자기 방지"를 켭니다.
  • Mac을 원격 작업 서버로 쓸 때는 System Settings → General → Sharing → Remote Login을 켜서 SSH로 접속하고, 그 안에서 tmux를 씁니다.

Windows (WSL2): 세 겹의 "잠들기"

Windows는 사용 방식에 따라 답이 다릅니다.

사용 방식세션 유지 방법
Windows를 클라이언트로만 사용 (원격 Linux에 SSH)Windows Terminal + 내장 OpenSSH로 접속하면 이 글 내용이 그대로 적용됩니다. tmux는 서버에서 돌기 때문에 PC가 잠들어도 에이전트는 계속 돕니다
Windows PC에서 직접 에이전트 실행WSL2 + tmux. 이 절의 설정이 필요합니다
네이티브 Windows(PowerShell)에서만 실행tmux 같은 detach/attach 방법이 없습니다. 끊기면 claude --resume / codex resume으로 대화만 복구합니다

Claude Code는 네이티브 Windows와 WSL을 모두 지원하지만, tmux와 함께 쓰려면 WSL 안에 설치해야 합니다. Codex CLI도 Windows에서는 WSL에서 실행하는 방식이 권장됩니다.

# PowerShell (관리자) — WSL2 + Ubuntu 설치
wsl --install -d Ubuntu
wsl --update
# WSL Ubuntu 안에서
sudo apt-get update && sudo apt-get install -y tmux

WSL2에서 에이전트가 사라지는 원인은 세 겹입니다.

① WSL 자체의 유휴 종료. 열린 WSL 터미널이 하나도 없으면 WSL은 잠시 뒤 배포판 인스턴스와 VM을 내립니다. 이때 tmux 서버도 함께 종료됩니다. Windows 쪽 %UserProfile%\.wslconfig에서 유휴 타임아웃을 끕니다.

# %UserProfile%\.wslconfig
[wsl2]
vmIdleTimeout=-1
 
[general]
instanceIdleTimeout=-1
wsl --shutdown   # 설정 반영 (WSL 전체 재시작)

WSL 버전에 따라 이 설정만으로는 유휴 종료를 완전히 막지 못하는 사례가 보고되어 있습니다. 가장 확실한 방법은 로그온할 때 WSL 안에서 tmux를 띄워 두는 것입니다. 작업 스케줄러에 "로그온 시" 트리거로 다음 작업을 등록합니다.

# 작업 스케줄러 작업으로 등록 (로그온 시 실행)
$action  = New-ScheduledTaskAction -Execute "wsl.exe" -Argument "-d Ubuntu -- tmux new -A -d -s main"
$trigger = New-ScheduledTaskTrigger -AtLogOn
Register-ScheduledTask -TaskName "WSL tmux" -Action $action -Trigger $trigger

WSL에서 systemd를 켜면(/etc/wsl.conf의 [boot] 아래 systemd=true) Linux 절의 systemd user 서비스와 loginctl enable-linger도 그대로 쓸 수 있습니다.

② Windows 절전. PC가 잠들면 WSL VM도 멈춥니다. macOS의 caffeinate에 해당하는 설정이 필요합니다.

# 전원 연결 시 절전 끄기
powercfg /change standby-timeout-ac 0

설정을 영구히 바꾸고 싶지 않다면 PowerToys의 Awake로 필요한 시간 동안만 깨어 있게 할 수 있습니다.

③ Windows Update 자동 재부팅. 밤새 돌려 둔 에이전트를 가장 자주 죽이는 원인입니다. 설정 → Windows 업데이트 → 고급 옵션 → 사용 시간을 작업 시간대에 맞춰 두세요. 재부팅이 일어나도 7장의 tmux-resurrect와 --resume 조합으로 복구할 수 있습니다.

WSL2에서 추가로 챙길 것:

  • 프로젝트는 WSL 파일시스템에 둡니다. /mnt/c/...(Windows 드라이브)에서 작업하면 파일 I/O와 파일 감시가 크게 느려서, 에이전트의 검색·빌드·테스트가 모두 굼떠집니다. ~/projects처럼 WSL 홈 아래에 clone합니다.
  • 터미널은 Windows Terminal을 씁니다. true color, OSC52 클립보드를 지원하므로 4장의 .tmux.conf를 그대로 쓸 수 있습니다.
  • mosh: Windows용 공식 mosh 클라이언트는 없습니다. Windows에서 원격 서버에 붙는다면 WSL 안에서 mosh를 실행하거나, SSH + ServerAliveInterval로 대신합니다.

공통: 네트워크가 자주 바뀐다면 mosh

카페 Wi-Fi와 테더링을 오가거나 노트북을 자주 재우는 환경이라면 SSH 대신 mosh를 씁니다. mosh는 IP가 바뀌어도 세션이 유지되고, 끊긴 동안 입력을 로컬에서 먼저 보여 줍니다. tmux와 조합하는 것이 표준입니다.

brew install mosh            # macOS 클라이언트
sudo apt-get install mosh    # 서버 (UDP 60000-61000 개방 필요)
 
mosh dev-server -- tmux new -A -s agent

7. 재부팅에서 살아남기

여기서 가장 많이 헷갈리는 점은 tmux를 복구하는 것과 에이전트 대화를 복구하는 것이 별개라는 것입니다. "세션 유지"를 세 층으로 나눠서 봐야 합니다.

연결·프로세스·컨텍스트의 세 계층별 장애 요인, 복구 수단, 보장 결과를 정리한 세션 복구 모델

사건tmux 세션에이전트 프로세스대화 기록복구 방법
SSH 끊김유지유지유지tmux attach
서버 재부팅소멸소멸디스크에 남아 있음resurrect + claude --resume / codex resume
/clear, 새 세션유지유지새로 시작파일로 남긴 컨텍스트

tmux-resurrect / continuum

tmux-resurrect는 세션·window·pane 배치와 작업 디렉터리를 저장하고 복원합니다. tmux-continuum은 이를 주기적으로 자동 저장하고, tmux가 시작될 때 자동 복원합니다.

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# ~/.tmux.conf 하단에 추가
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
 
set -g @continuum-restore 'on'        # tmux 시작 시 자동 복원
set -g @continuum-save-interval '15'  # 15분마다 저장
 
run '~/.tmux/plugins/tpm/tpm'

tmux 안에서 Ctrl-b I(대문자 i)를 누르면 플러그인이 설치됩니다. 수동 저장은 Ctrl-b Ctrl-s, 복원은 Ctrl-b Ctrl-r입니다.

resurrect는 창 배치와 디렉터리는 복원하지만 에이전트의 메모리 상태까지 되살리지는 못합니다. 에이전트는 각 도구의 resume 기능으로 디스크에 저장된 대화 기록을 다시 불러와야 합니다.

# Claude Code
claude --continue        # 현재 디렉터리의 가장 최근 대화
claude --resume          # 목록에서 골라서 재개 (세션 ID 지정도 가능)
 
# Codex CLI
codex resume             # 목록에서 선택
codex resume --last      # 가장 최근 세션

5장의 agent-session 스크립트를 쓰면 재부팅 후에도 같은 명령 하나로 창 배치와 대화 재개가 함께 처리됩니다.

8. 토큰은 어디서 새는가

세션 유지 방법을 알았으니 이제 비용 쪽을 봅니다. 먼저 오해 하나를 짚고 넘어갑니다.

tmux에서 대기 중인 에이전트는 토큰을 쓰지 않습니다. 토큰은 모델을 호출할 때만 소비됩니다. 비용이 늘어나는 원인은 "오래 켜 둔 것"이 아니라 **"오래 이어 쓴 대화"**와 **"오래 쉬었다가 다시 쓴 대화"**입니다.

매 턴, 전체 컨텍스트를 다시 보낸다

LLM API는 상태를 저장하지 않습니다. 에이전트는 매 요청마다 시스템 프롬프트 + 도구 정의 + CLAUDE.md/AGENTS.md + 지금까지의 대화 전체 + 도구 실행 결과를 다시 보냅니다. 대화가 10만 토큰까지 자랐다면 "응, 계속해" 한 마디에도 10만 토큰 이상의 입력이 발생합니다.

이를 줄여 주는 것이 프롬프트 캐시입니다. 직전 요청과 앞부분(prefix)이 같으면 캐시에서 읽고, 캐시 읽기는 일반 입력 단가의 약 10% 수준입니다. 그래서 짧은 간격으로 연속 작업하는 동안에는 컨텍스트가 커도 비용이 버틸 만합니다.

함정: 쉬는 동안 캐시가 만료된다

캐시에는 수명(TTL)이 있습니다. Anthropic API 기준 기본 5분이고, 1시간 옵션이 있습니다(Claude Code는 사용 패턴에 따라 이 둘을 고릅니다). tmux로 세션을 켜 둔 채 점심을 먹고 돌아와서 메시지를 보내면 다음 일이 벌어집니다.

연속 작업 중에는 프롬프트 캐시 읽기로 비용이 낮지만, 두 시간 대기 후 캐시 TTL이 만료되면 120K 컨텍스트 전체를 다시 입력하고 캐시를 재작성하는 수명 주기

복귀 후 첫 메시지는 커진 컨텍스트 전체를 캐시 할인 없이 다시 처리합니다. 캐시 쓰기는 일반 입력보다 단가가 높아서(5분 TTL 약 1.25배, 1시간 TTL 약 2배) 오히려 더 비쌀 수 있습니다. 세션을 오래 유지하는 사람일수록 이 패턴을 자주 겪습니다.

그 밖의 누수 지점

누수설명
고정 비용MCP 서버 도구 정의, 긴 CLAUDE.md/AGENTS.md, 스킬 목록은 모든 턴에 포함됩니다
거대한 도구 출력빌드 로그, cat 한 대용량 파일, 테스트 전체 출력이 그대로 컨텍스트에 쌓입니다
자동 compact컨텍스트가 가득 차면 자동 요약이 일어나는데, 요약 자체도 모델 호출이며 무엇이 남을지 통제할 수 없습니다
방치된 자동 실행/loop, 자동 재시도, 백그라운드 에이전트는 사용자가 없어도 실제로 계속 호출합니다

9. 토큰 관리 전략

원칙은 "세션은 오래, 대화는 짧게" 입니다. tmux 세션(작업 공간)은 몇 주씩 유지해도 되지만, 그 안의 대화(컨텍스트)는 작업 단위로 자르고 남길 컨텍스트는 파일로 옮깁니다.

① 작업 단위로 대화를 끊는다

한 작업이 끝나면 다음 작업은 새 대화로 시작합니다.

Claude CodeCodex CLI
새 대화/clear/new
수동 요약/compact <남길 내용>/compact
현재 사용량/context, /usage(/cost)/status
이전 대화 재개/resume, claude --resume/resume, codex resume

"버그 A 수정" 대화에서 "기능 B 추가"로 넘어가면, A를 디버깅한 로그 수만 토큰이 B의 매 턴마다 따라옵니다. /clear 한 번으로 이 비용이 사라집니다.

② 자동 compact를 기다리지 말고 먼저 compact한다

자동 compact는 컨텍스트가 꽉 찼을 때 일어나므로 이미 비싼 턴을 여러 번 지난 뒤입니다. 그리고 무엇을 남길지 모델이 정합니다. 작업의 단락이 끝났을 때 직접 지시하는 편이 낫습니다.

/compact 현재 브랜치의 목적, 수정한 파일 목록, 남은 TODO, 실패했던 접근법만 남겨줘. 로그와 탐색 과정은 버려도 된다.

③ 컨텍스트는 대화가 아니라 파일

대화는 사라지지만 파일은 남습니다. 두 종류로 나눠 관리합니다.

  • 오래 유지할 규칙 — CLAUDE.md(Claude Code), AGENTS.md(Codex). 빌드 명령, 코딩 규칙, 함정 등. 짧게 유지합니다. 매 턴 포함되는 고정 비용이기 때문입니다.
  • 진행 상황 — HANDOFF.md 같은 작업 노트. 자리를 비우기 전에 에이전트에게 업데이트를 시킵니다.
지금까지 진행 상황을 HANDOFF.md에 정리해줘: 목표, 완료한 것, 다음 단계, 주의할 점. 10줄 이내로.

복귀 후에는 묵은 대화를 이어 열지 않고 새 대화에서 이렇게 시작합니다.

HANDOFF.md 읽고 다음 단계부터 이어서 진행해.

12만 토큰짜리 대화를 캐시 없이 다시 읽는 대신, 수백 토큰짜리 노트에서 다시 시작하는 셈입니다.

④ 복귀했을 때: 이어갈까, 새로 시작할까

tmux 복귀 후 경과 시간, 컨텍스트 크기, 작업 연속성에 따라 그대로 계속하거나 compact 또는 새 세션을 선택하는 의사결정 흐름

⑤ 고정 비용 줄이기

  • MCP 서버 정리: 쓰지 않는 MCP 서버는 끕니다(Claude Code /mcp, Codex codex mcp). 서버 하나가 도구 정의 수천 토큰을 매 턴 추가할 수 있습니다. /context로 항목별 점유량을 확인합니다.
  • 지시 파일 다이어트: CLAUDE.md/AGENTS.md에는 매번 필요한 것만 둡니다. 가끔 필요한 상세 내용은 별도 문서로 빼고, "배포는 docs/deploy.md 참고"처럼 경로만 적습니다.
  • 출력을 붙여넣지 말고 경로를 준다: 대용량 로그를 프롬프트에 붙여넣는 대신 "build.log에서 에러 원인 찾아줘"라고 하면 에이전트가 grep·tail로 필요한 부분만 읽습니다.
  • 명령 출력 압축: git, 테스트 러너 등의 출력을 요약해서 컨텍스트에 넣어 주는 CLI 프록시(예: RTK 같은 도구)를 쓰면 도구 출력 토큰을 크게 줄일 수 있습니다.

⑥ 위임과 모델 선택

  • 서브에이전트로 탐색 위임: "이 저장소에서 인증 흐름 찾아줘" 같은 넓은 탐색은 서브에이전트에게 맡깁니다. 수십 개 파일을 읽은 흔적은 서브에이전트 쪽에 남고, 메인 대화에는 결론만 돌아옵니다.
  • 작업에 맞는 모델·추론 강도: 단순 수정·포맷팅에 최상위 모델과 높은 추론 강도는 과합니다. Claude Code는 /model로 모델을 바꾸고, Codex는 /model 또는 ~/.codex/config.toml의 model_reasoning_effort로 추론 강도를 조절합니다.

⑦ "유지"와 "실행 중"을 구분한다

tmux에 떠 있는 에이전트가 입력 대기 상태인지, 자율 실행 중인지 구분해야 합니다. 퇴근 전에 확인할 것:

  • /loop나 예약 작업이 켜져 있지 않은가
  • 실패하면 무한히 재시도하는 스크립트를 에이전트가 돌리고 있지 않은가
  • 자율 실행을 걸어 둘 거라면 예산(최대 턴 수, 비용 한도)을 정했는가

10. 모니터링

에이전트 안에서

  • Claude Code: /context는 시스템 프롬프트·도구·메모리 파일·대화가 각각 몇 토큰인지 보여 주고, /usage(/cost)는 세션 누적 사용량을 보여 줍니다. /statusline으로 하단 상태줄에 모델·컨텍스트 사용률 같은 정보를 항상 띄울 수 있습니다.
  • Codex CLI: /status로 현재 모델, 토큰 사용량, 남은 컨텍스트를 확인합니다.

에이전트 밖에서

Claude Code는 대화 기록을 ~/.claude/projects/ 아래 JSONL로 남깁니다. ccusage 같은 도구로 일별·세션별 사용량을 집계할 수 있습니다.

npx ccusage@latest daily      # 일별 사용량
npx ccusage@latest session    # 세션별 사용량

tmux 상태바에 띄우기

여러 window에 에이전트를 띄워 두면 어느 쪽이 일하고 있는지 놓치기 쉽습니다. 4장의 monitor-activity로 출력이 생긴 window를 상태바에 표시하고, 필요하면 사용량 요약도 상태바 오른쪽에 붙입니다.

상태바 명령은 status-interval마다 실행되므로, 무거운 집계는 cron으로 파일에 기록하고 상태바는 그 파일을 읽기만 하도록 분리합니다.

#!/usr/bin/env bash
# ~/bin/agent-usage : 오늘 Claude Code 사용 비용을 파일로 기록
today=$(date +%Y%m%d)
npx -y ccusage@latest daily --json --since "$today" 2>/dev/null \
  | jq -r '.totals.totalCost // 0' \
  | xargs printf 'claude $%.2f\n' > ~/.cache/agent-usage.txt
# crontab -e : 10분마다 갱신
*/10 * * * * $HOME/bin/agent-usage
# ~/.tmux.conf
set -g status-interval 60
set -g status-right '#(cat ~/.cache/agent-usage.txt) | %H:%M'

ccusage의 JSON 구조는 버전마다 달라질 수 있습니다. 먼저 npx ccusage@latest daily --json의 출력을 확인하고 jq 경로를 맞추세요. cron 환경에는 npx·jq가 PATH에 없을 수 있으니 스크립트 상단에 PATH를 지정하는 것이 안전합니다.

11. 보안 체크

세션을 오래 열어 둔다는 것은 공격 표면이 오래 열려 있다는 뜻이기도 합니다.

  • 공유 서버의 tmux 소켓: tmux 소켓은 /tmp/tmux-<UID>/ 아래에 사용자 전용 권한으로 만들어집니다. 권한을 임의로 넓히지 마세요. 소켓에 접근할 수 있으면 세션에 붙어서 에이전트에게 명령할 수 있습니다.
  • 자리 비운 동안의 권한 모드: 모든 도구 실행을 자동 승인하는 모드(Claude Code의 --dangerously-skip-permissions, Codex의 full-auto/bypass 계열)로 장시간 방치하지 마세요. 꼭 필요하면 컨테이너·VM처럼 격리된 환경에서만 씁니다.
  • API 키: 키를 .tmux.conf나 스크립트에 하드코딩하지 말고, 셸 환경변수나 각 CLI의 로그인 기능을 씁니다. tmux 스크롤백(history-limit 100000)에 키가 출력되어 남지 않게 주의합니다.
  • 화면 잠금: 공용 장소에서 attach한 채 자리를 비운다면 Ctrl-b d로 detach하는 습관을 들입니다.

12. 한 장 요약

영역할 일
기본에이전트는 항상 tmux new -A -s <이름> 안에서 실행
설정history-limit, escape-time 0, extended-keys, set-clipboard on
자동화프로젝트별 agent-session 스크립트로 window 구성 + resume
LinuxKillUserProcesses 확인 → loginctl enable-linger, 필요 시 systemd user 서비스
macOS로컬 실행이면 caffeinate -i 또는 pmset, 원격이면 Remote Login + tmux
WindowsWSL2 안에서 tmux + 에이전트 실행, .wslconfig 유휴 타임아웃 해제, 절전·업데이트 재부팅 관리, 프로젝트는 WSL 파일시스템에
네트워크이동이 잦으면 mosh + tmux
재부팅tmux-resurrect/continuum으로 창 배치 복구 + claude --resume / codex resume
토큰 원칙세션은 오래, 대화는 짧게 — 작업마다 /clear·/new
복귀 시오래 쉬었고 컨텍스트가 크면 이어 쓰지 말고 compact 또는 HANDOFF.md에서 새로 시작
고정 비용미사용 MCP 끄기, CLAUDE.md/AGENTS.md 짧게, 로그는 경로로 전달
관측/context, /usage, /status, ccusage, tmux 상태바
보안자동 승인 모드로 방치 금지, 소켓 권한 유지, 키 하드코딩 금지

tmux는 에이전트의 프로세스를 지켜 주고, 파일로 남긴 컨텍스트는 에이전트의 기억을 지켜 줍니다. 둘을 같이 운영하면 연결이 끊기든 서버가 재부팅되든, 다음 작업을 가벼운 컨텍스트로 다시 시작할 수 있습니다.

13. 용어집

용어설명
tmux터미널 멀티플렉서. 하나의 터미널 안에서 여러 세션·창을 만들고, 연결이 끊겨도 그 안의 프로세스를 유지합니다
세션 / window / panetmux의 계층 구조. 세션은 작업 공간 단위, window는 세션 안의 탭, pane은 window를 나눈 분할 화면입니다
접두키(prefix)tmux 단축키 앞에 누르는 키. 기본값은 Ctrl-b입니다
attach / detach실행 중인 tmux 세션에 화면을 붙이거나(attach) 떼는(detach) 동작. detach해도 세션은 계속 돕니다
tmux 서버 / 클라이언트세션과 프로세스를 실제로 들고 있는 백그라운드 데몬(서버)과, 이를 화면에 보여 주는 터미널(클라이언트)
SIGHUP터미널 연결이 끊겼을 때 프로세스에 보내는 신호(hang up). 기본 동작은 프로세스 종료입니다
TUIText User Interface. Claude Code·Codex처럼 터미널 안에서 화면을 그리는 대화형 프로그램
systemd-logindLinux에서 사용자 로그인 세션을 관리하는 서비스. KillUserProcesses 설정으로 로그아웃 시 프로세스 정리 여부를 정합니다
linger사용자가 로그인해 있지 않아도 그 사용자의 systemd 매니저와 프로세스를 유지하는 기능(loginctl enable-linger)
OOM Killer메모리가 부족할 때 커널이 프로세스를 골라 강제 종료하는 메커니즘
caffeinate / pmsetmacOS의 잠자기 방지 명령 / 전원 관리 설정 명령
WSL2Windows Subsystem for Linux 2. 경량 VM 위에서 실제 Linux 커널을 돌려 Windows에서 Linux 환경을 제공합니다
.wslconfigWSL2 전역 설정 파일(%UserProfile%\.wslconfig). 메모리·유휴 타임아웃 등을 정합니다
OSC52터미널 이스케이프 시퀀스의 하나. 원격 셸·tmux에서 복사한 텍스트를 로컬 클립보드로 보낼 수 있게 해 줍니다
moshMobile Shell. UDP 기반 원격 셸로, IP가 바뀌거나 잠시 끊겨도 세션이 유지됩니다
tmux-resurrect / continuumtmux 세션 배치를 저장·복원하는 플러그인 / 이를 주기적으로 자동 저장·복원하는 플러그인
TPMTmux Plugin Manager. tmux 플러그인 설치·관리 도구
토큰(token)모델이 텍스트를 처리하는 단위. API 비용은 입력·출력 토큰 수로 계산됩니다
컨텍스트(context)한 번의 모델 호출에 함께 보내는 정보 전체. 시스템 프롬프트, 도구 정의, 지시 파일, 대화 기록, 도구 결과로 구성됩니다
컨텍스트 윈도모델이 한 번에 받을 수 있는 최대 토큰 수
프롬프트 캐시직전 요청과 앞부분이 같은 입력을 저장해 두었다가 싸고 빠르게 재사용하는 기능. 캐시 읽기는 일반 입력의 약 10% 단가입니다
TTLTime To Live. 캐시가 유지되는 시간. 이 시간이 지나면 다음 요청은 캐시 없이 처리됩니다
compact(컴팩션)긴 대화를 요약해 컨텍스트를 줄이는 작업. 수동(/compact)과 자동(auto-compact)이 있습니다
CLAUDE.md / AGENTS.mdClaude Code / Codex가 세션 시작 시 자동으로 읽는 프로젝트 지시 파일. 매 턴 컨텍스트에 포함되는 고정 비용입니다
핸드오프 노트작업 진행 상황을 적어 둔 파일(예: HANDOFF.md). 새 대화에서 작업을 이어가기 위한 요약본입니다
MCPModel Context Protocol. 에이전트에 외부 도구·데이터를 연결하는 표준 프로토콜. 연결된 서버의 도구 정의가 컨텍스트를 차지합니다
서브에이전트메인 에이전트가 일부 작업을 맡기는 별도 에이전트. 작업 과정은 자기 컨텍스트에 남기고 결과만 돌려줍니다
reasoning effort모델이 답하기 전에 얼마나 깊이 추론할지 정하는 설정. 높을수록 품질은 오르지만 토큰과 시간이 늘어납니다
ccusageClaude Code의 로컬 대화 기록(JSONL)을 읽어 일별·세션별 토큰 사용량과 비용을 집계하는 오픈소스 CLI