Back

/ 6 min read

tmux 사용 로그

tmux를 중계 장치로 claude code끼리 대화 시키기

Pasted image 20260718230348

macOS
└─ 터미널 앱: iTerm2 또는 cmux
└─ 셸: zsh
└─ tmux (선택 사항)
├─ pane → zsh → Claude A
└─ pane → zsh → Claude B
  • iTerm2 : macOS 용 터미널 에뮬레이터
  • cmux : macOS 터미널 앱, GUI 앱
  • tmux : 하나의 화면에 여러 터미널을 만들고 제어해서 화면을 닫아도 세션을 계속 실행한 뒤 나중에 다시 붙을 수 있는 터미널 멀티플렉서

초기 Unit 환경에서는 한 터미널이 하나의 작업 공간이었음. 다른 서버에 SSH를 통하여 접근하여 작업을 할 때, 터미널 하나를 열고 접속해서 작업을 하는 플로우였음.

내 Mac 회사나 데이터센터의 서버
──────────── ───────────────────────
iTerm2 Linux
VS Code 프로젝트 파일
키보드와 화면 강력한 CPU / GPU
│ 대용량 메모리
└────── SSH ───────────▶ Python 실행

SSH로 로그인을 하게 되면, 서버는 보통 그 연결을 위해 가상 터미널인 PTY라는 것을 만들고 그 안에서 bashzsh를 실행한다고 한다. 그런데 인터넷이 끊기거나 Mac을 닫게 되면, SSH 연결이 끊기면서 -> 서버의 가상 터미널이 닫히면서 -> 셸과 프로그램이 터미널 연결 종료 신호를 받아 -> 프로그램 종료

tmux를 사용하게 되면, SSH가 제공한 터미널에 연결되는 게 아니라 tmux가 제공한 가상 터미널에 연결이 됨 -> SSH 연결이 끊겨도 서버 내부의 tmux 세션과 프로그램은 계속 실행됨 -> 나중에 다시 SSH 로 접속해 tmux 세션에 재접속이 가능함

tmux 세션을 이용해서 통신하기

Claude A
└─ Bash로 tmux send-keys 실행
└─ Claude B의 터미널에 "hi" + Enter 입력
Claude B
└─ 그것을 사용자 입력으로 받아 응답

상황 : 왼쪽의 Claude 가 tmux의 send-keys 명령어를 사용하여 오른쪽의 Claude에게 입력을 보냈음. 오른쪽의 화면을 읽어서 다시 대응함 - send-keys: 지정한 pane에 실제 키 입력처럼 문자열을 전달함 - capture-pane : 지정한 pane에서 화면 출력을 읽음

  • 전체 동작 구조
iTerm2 왼쪽 pane iTerm2 오른쪽 pane
└─ tmux client └─ tmux client
└─ session 0 └─ session 1
└─ pseudo-terminal └─ pseudo-terminal
└─ Claude A └─ Claude B
└──── tmux server ────────┘
Unix socket

tmux 의 구조

tmux는 Session -> Window -> Pane 계층으로 되어있음

  • Session : 작업을 유지하는 가장 큰 단위
  • Window : 세션 안에서 나누는 작업 탭
  • Pane : 하나의 화면을 나누는 분할 영역

Pasted image 20260719094304

반복적으로 나오는 개념

  • nano : 터미널에 쓰는 메모장, nano 파일명 입력 시 파일을 메모장처럼 열어서 편집이 가능함
  • .zshrc : macOS 터미널(zsh)이 실행될 때마다 자동으로 읽는 설정 파일. 단축 명령어를 등록해두면 터미널을 열 때마다 자동으로 적용이 된다.
  • Alias : “단축어”와 같은 개념

자주 쓰이는 단축어

  • Control + b 후에 d -> 세션에서 나가기 (작업은 백그라운드에서 계속 돌아감)
  • (tmux 세션에서) exit -> 세션을 완전 종료 (tmux ls를 했을 때 세션이 없어짐)
  • tmux ls -> 현재 존재하는 세션을 보여줌 Pasted image 20260719100423 세션 이름 : 윈도우 개수
  • tmux attach -t 세션 이름 : tmux 세션에 다시 접속하기 (attach) Pasted image 20260719100518
  • tmux kill-session t 세션이름 : exit과 같은 역할로, 더 이상 필요 없는 세션을 종료함 Pasted image 20260719100731

iterm2를 분할 + 여러 tmux 세션을 여는 것 (vs) agent-team

iTerm2에서 command + D로 창을 나누고, 각 창에서

tmux new -s frontend
tmux new -s backend
tmux new -s test
======
사용자
├─ Claude A: 프론트엔드 작업
├─ Claude B: 백엔드 작업
└─ Claude C: 테스트 작업

iTerm2 에서 command + D로 창을 나누고, 각 창에서 세션을 생성한 뒤에 Claude를 실행하게 되면, 팀장은 사용자 자신이 되어서 병렬 작업이 가능해짐.

Agent Teams는 메인 Claude가 team lead가 됨

사용자
└─ Team lead Claude
├─ Frontend teammate
├─ Backend teammate
└─ Test teammate

Agent Teams에는 Team Lead Claude가 팀원을 생성한 다음, 작업을 알아서 나누고, 팀원을 직접 호출이 가능해짐