LabHub

vim 과 tmux · tmux 세션·창·패널 · 이론

tmux 는 클라이언트-서버다

LabHub 에서 이어서 보기

한 줄 요약

tmux 에서 명령을 실제로 실행하고 있는 것은 내 터미널이 아니라 서버 프로세스다. 내 터미널은 그 서버에 붙어 있는 화면일 뿐이라, 화면이 사라져도 작업은 계속된다.

왜 이게 필요했나

원격 서버에서 배포 스크립트를 돌리는 중에 와이파이가 끊겼다. 다시 접속했더니 스크립트는 중간에 죽어 있고, 절반만 적용된 상태가 남았다. 한 번쯤은 다들 겪는다.

왜 죽었을까. SSH 연결이 끊기면 그 세션의 컨트롤 터미널이 사라지고, 커널은 세션 리더에게 SIGHUP 을 보낸다. 셸은 그것을 자기 잡들에게 전파한다. 배포 스크립트는 내 셸의 자식이었으므로 함께 죽는다.

nohup 이나 setsid 로 이 연결고리를 끊을 수도 있다. 하지만 그러면 작업은 살아남되 화면을 다시 볼 수 없다. 진행 상황을 보려면 로그 파일을 따로 봐야 하고, 중간에 입력을 넣을 수도 없다.

tmux 는 다른 방향으로 푼다. 명령을 내 셸의 자식이 아니라 tmux 서버의 자식으로 만든다. tmux 서버는 내 SSH 세션과 무관한 별도 프로세스이고, 각 창의 유사 터미널(pty)을 소유한다. 내 터미널은 그 화면을 받아 보는 클라이언트일 뿐이다. 그래서 클라이언트가 사라져도 서버와 그 자식들은 아무 일도 없다. 다시 접속해 tmux attach 하면 화면까지 그대로 돌아온다.

어떻게 동작하나

구조는 4계층이고, 각각 익숙한 비유가 있다.

| 계층 | 비유 | 명령 |
| --- | --- | --- |
| Server | 운영체제 | 첫 세션을 만들 때 자동으로 뜬다 |
| Session | 바탕화면 / 작업공간 | tmux new -s dev |
| Window | 브라우저 탭 | prefix + c |
| Pane | 화면 분할 | prefix + % / " |

모든 키 입력은 prefix 키를 먼저 누르고 손을 뗀 뒤 명령 키를 누르는 2단계다. 기본값은 Ctrl-b 이고, 많은 사람이 손이 편한 Ctrl-a 로 바꾼다. 이때 셸의 "줄 맨 앞으로" 단축키와 겹치므로 bind C-a send-prefix 를 함께 넣어 두 번 누르면 원래 키가 전달되게 한다.

세션 다루기의 핵심 명령 다섯 개만 알면 첫날은 충분하다.

그리고 실무에서 가장 쓸모 있는 관용구 하나 - tmux new -A -s dev 는 세션이 있으면 붙고 없으면 만든다. 셸 alias 로 걸어 두면 매번 존재 여부를 확인할 필요가 없다.

현장에서 만나는 모습

야간 마이그레이션. DB 서버에 접속해 tmux new -s migration 으로 세션을 만들고 마이그레이션을 시작한 뒤 detach 하고 퇴근한다. 다음 날 attach 하면 진행 상황이 그대로 보인다. nohup 과 달리 화면과 입력이 살아 있다는 점이 다르다.

개발 환경 3분할. 왼쪽에 편집기, 오른쪽 위에 개발 서버, 오른쪽 아래에 테스트 감시. 이 배치를 매번 손으로 만드는 대신 스크립트 한 줄로 재현한다. 여기서 자주 빠뜨리는 것이 -c "#{pane_current_path}" 다. 이게 없으면 새로 만든 페인이 홈 디렉터리에서 열려 매번 cd 를 다시 쳐야 한다.

여러 서버 동시 운영. 4개 서버에 각각 ssh 로 붙은 페인 4개를 만들고 synchronize-panes 를 켜면 입력하는 모든 명령이 4곳에서 동시에 실행된다. 위험한 만큼 강력하므로, 켜고 끄는 상태를 상태바에 표시해 두는 게 좋다.

용어 함정 하나. tmux 의 split-window -h 는 "가로로 나눈다"가 아니라 좌우로 나눈다는 뜻이다(수평 방향으로 배치). -v 는 상하다. 헷갈리므로 대화할 때는 "좌우 분할 / 상하 분할"이라고 말하고, 플래그는 따로 외우는 편이 낫다.

설정 두 개는 첫날 바꿀 만하다. base-index 1pane-base-index 1 - 0번 키가 키보드 오른쪽 끝에 있어 불편하기 때문이다. 그리고 history-limit 은 기본이 2000줄이라 로그를 조금만 봐도 잘린다. 5만 줄 정도가 실용적인 상한이다.

다음 실습에서 할 것

두 개의 실습이 이어진다. tmux-basics 에서는 세션과 윈도우를 만들고 detach 상태를 확인하며 설정 파일이 실제로 서버에 반영되는지 검증한다. tmux-panes 에서는 페인 분할·제목·확대·동기화를 다루고, 마지막에는 개발 레이아웃을 재현하는 스크립트를 만든다. 두 실습 모두 마지막 단계가 자동화 스크립트인 이유는, 손으로 만든 배치는 다음 날 사라지지만 스크립트는 남기 때문이다.