/ 6 min read
tmux 사용 로그
tmux를 중계 장치로 claude code끼리 대화 시키기

macOS└─ 터미널 앱: iTerm2 또는 cmux └─ 셸: zsh └─ tmux (선택 사항) ├─ pane → zsh → Claude A └─ pane → zsh → Claude B- iTerm2 : macOS 용 터미널 에뮬레이터
- cmux : macOS 터미널 앱, GUI 앱
- tmux : 하나의 화면에 여러 터미널을 만들고 제어해서 화면을 닫아도 세션을 계속 실행한 뒤 나중에 다시 붙을 수 있는 터미널 멀티플렉서
초기 Unit 환경에서는 한 터미널이 하나의 작업 공간이었음. 다른 서버에 SSH를 통하여 접근하여 작업을 할 때, 터미널 하나를 열고 접속해서 작업을 하는 플로우였음.
내 Mac 회사나 데이터센터의 서버──────────── ───────────────────────iTerm2 LinuxVS Code 프로젝트 파일키보드와 화면 강력한 CPU / GPU │ 대용량 메모리 └────── SSH ───────────▶ Python 실행SSH로 로그인을 하게 되면, 서버는 보통 그 연결을 위해 가상 터미널인 PTY라는 것을 만들고 그 안에서 bash나 zsh를 실행한다고 한다.
그런데 인터넷이 끊기거나 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 sockettmux 의 구조
tmux는 Session -> Window -> Pane 계층으로 되어있음
- Session : 작업을 유지하는 가장 큰 단위
- Window : 세션 안에서 나누는 작업 탭
- Pane : 하나의 화면을 나누는 분할 영역

반복적으로 나오는 개념
- nano : 터미널에 쓰는 메모장,
nano 파일명입력 시 파일을 메모장처럼 열어서 편집이 가능함 - .zshrc : macOS 터미널(zsh)이 실행될 때마다 자동으로 읽는 설정 파일. 단축 명령어를 등록해두면 터미널을 열 때마다 자동으로 적용이 된다.
- Alias : “단축어”와 같은 개념
자주 쓰이는 단축어
- Control + b 후에 d -> 세션에서 나가기 (작업은 백그라운드에서 계속 돌아감)
- (tmux 세션에서) exit -> 세션을 완전 종료 (tmux ls를 했을 때 세션이 없어짐)
- tmux ls -> 현재 존재하는 세션을 보여줌
세션 이름 : 윈도우 개수 - tmux attach -t
세션 이름: tmux 세션에 다시 접속하기 (attach)
- tmux kill-session t
세션이름: exit과 같은 역할로, 더 이상 필요 없는 세션을 종료함
iterm2를 분할 + 여러 tmux 세션을 여는 것 (vs) agent-team
iTerm2에서 command + D로 창을 나누고, 각 창에서
tmux new -s frontendtmux new -s backendtmux 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 teammateAgent Teams에는 Team Lead Claude가 팀원을 생성한 다음, 작업을 알아서 나누고, 팀원을 직접 호출이 가능해짐