Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

tmuxinator로 tmux 세션을 관리하자

터미널을 자주 사용한다면 tmux는 꼭 배워야 할 도구 중 하나라고 생각한다.(이전 글 참고) 처음 배울 때는 서버에 접속하는 경우 인증서버를 거쳐야 하는데 관리 서버가 여러 대이다 보니 매번 인증서버를 거치는 게 불편해서 인증서버는 한 번만 거치고 그 안에서 tmux로 여러 서버를 한꺼번에 접속해서 운영했다. 이때 tmux의 유용함은 강력히 느꼈지만, 그 뒤로는 한꺼번에 여러 서버를 관리할 일이 많지 않아서 그다지 사용하지 않았고 일반적인 개발에서는 터미널 앱의 탭 기능을 사용해도 크게 불편함이 없었다. (난 보통은 iTerm2를 사용하는데 프로젝트별로 탭을 하나씩 열어두는 편이다.)

여전히 iTerm2 자체에는 만족하고 있지만, 최근에는 조금씩 불편함을 느끼고 있었다. 요즘은 Grunt나 빌드도구 등이 발달해서 그런지 토이 프로젝트를 하나 한다고 해도 터미널에서 서버를 실행해야 하고 less나 CoffeeScript같은 전처리자 등이 있는 경우는 컴파일이 자동으로 되도록 실행도 해야 하고 테스트를 돌리고 있다면 테스트도 코드 수정할 때마다 자동으로 돌아가게도 하다 보니 한 프로젝트에서 탭을 2~3개 열게 되는 게 보통이었다. 그리고 여기서 git으로 커밋을 하려면 터미널 탭이 하나 더 필요해진다.(다른 탭에 실행된 명령어를 하나 끄던가..) 한 번에 이것저것 하는 경우가 많다 보니 금방 탭이 많이 늘어나고 관리가 안 되기 시작했다. 그래서 다시 로컬 개발에서도 tmux를 쓰기 시작했다. 물론 안 쓴지가 오래돼서 사용법을 잊을 것 같은 걱정이 있어서 이 기회에 다시 tmux를 쓰자는 생각도 있었다.

tmuxinate

tmuxinator는 tmux의 세션을 관리해주는 도구이다. 보통 tmux를 사용하면 항상 같은 형식의 창이나 윈도우을 만들어서 사용하게 된다. 이해하기 쉽게 다음과 같은 상황을 생각해 보자.

상황 1

  1. 모니터링 해야 하는 서버가 4대가 있다.
  2. tmux 세션을 열어서 서버 4대에 모두 접속한다.
  3. 인식하기 쉽도록 각 윈도우에 web-1, web-2, web-3, web-4라고 이름을 붙인다.
  4. 각 윈도우에서 로그 혹은 서버의 상태를 모니터링 할 수 있는 명령어를 실행한다.

상황 2

  1. 웹 애플리케이션 개발하고 있다.
  2. tmux 세션을 열어서 첫 번째 윈도우에서 서버를 구동하고 로그를 모니터링한다.
  3. LESS 파일을 수정할 때마다 자동으로 CSS 파일을 생성하도록 세로로 패널을 분리해서 grunt나 gulp 명령어를 실행한다.
  4. 윈도우를 하나 더 열어서 수정한 파일을 git commit하는 용도로 사용한다.

예시 상황이긴 하지만 이런 상황에 tmux로 작업을 하면 프로젝트나 환경에 큰 변화가 있지 않은 한 같은 설정을 계속 사용하게 된다. 그래서 tmux 세션을 닫지 않고 detach만 해놓고 나중에 다시 접속하거나 해서 사용하는데 접속 시 마다 창에 이름 지정하고 명령어 실행하고 하는 것은 매우 귀찮은 일이다. 서버 같은 경우는 리부팅하는 경우가 많지 않으므로 한번 설정해 놓으면 다시 설정할 일이 거의 없어서 별로 불편한 줄도 몰랐지만 로컬에서 tmux를 사용하다 보니 리부팅 하는 경우도 종종 있어서 tmux 세션을 다시 설정하는 게 많이 귀찮다. 이런 상황을 위해서 tmuxinator는 tmux 세션과 설정을 기억하고 관리한다.

설치

tmuxinator는 gem으로 설치한다.

$ gem install tmuxinator

tmuxinator는 셸의 기본 에디터를 사용하는데 설정이 안 되어 있다면 export EDITOR='vim'처럼 EDITOR환경변수에 사용하는 에디터를 설정해 주면 된다.

YAML 설정 파일

tmuxinator new PROJECT_NAME을 입력하면 다음과 같이 기본 템플릿으로 파일이 열린다.(여기서는 test-project라는 이름을 사용했다.)

# ~/.tmuxinator/test-project.yml

name: test-project
root: ~/

# Optional tmux socket
# socket_name: foo

# Runs before everything. Use it to start daemons etc.
# pre: sudo /etc/rc.d/mysqld start

# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions.
# pre_window: rbenv shell 2.0.0-p247

# Pass command line options to tmux. Useful for specifying a different tmux.conf.
# tmux_options: -f ~/.tmux.mac.conf

# Change the command to call tmux.  This can be used by derivatives/wrappers like byobu.
# tmux_command: byobu

# Specifies (by name or index) which window will be selected on project startup. If not set, the first window is used.
# startup_window: logs

windows:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - guard
  - server: bundle exec rails s
  - logs: tail -f log/development.log

이 파일은 tmux 세션의 정보를 저장하고 있는 yaml 파일인데 간단하고 직관적이라 이 yaml 설정파일을 살펴보면 대략 내용을 짐작할 수 있다. 이 파일은 프로젝트명을 파일명으로 해서 ~/.tmuxinator/밑에 저장된다. 상세한 설정을 다 보기는 어렵고 주석 처리되지 않은 핵심 부분만 보자.

name: test-project
root: ~/

name부분은 앞에서 지정한 프로젝트명으로 여러 설정 중 사용할 설정을 구분하는 용도로 사용한다. root는 tmux 세션을 시작할 워킹 디렉토리이다. 원하는 위치로 이동해서 tmux 세션을 시작하거나 할 필요없이 tmux가 시작되어야 하는 기본 폴더 위치를 여기서 지정할 수 있다.

windows:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - guard
  - server: bundle exec rails s
  - logs: tail -f log/development.log

windows 부분은 tmux 세션을 시작할 때 만들 창과 각 창의 레이아웃 및 실행할 명령어를 지정하는 것이다. tmux를 써본 사람이라면 실행만 해보면 바로 이해할 수 있는데 간단히 설명하면 이 설정을 시작하면 editor, server, logs라는 3개의 창이 뜨고 각각 해당의 이름으로 지정이 된다. editor창은 세로로 나누는데 첫 팬에서는 vim 명령어를 실행하고 다른 팬에서는 guard라는 명령어를 실행한다. server 창에서는 bundle 명령어를 실행하고 logs 창에서는 tail로 로그 메시지를 확인한다.

tmuxinator 명령어 사용

이제 직접 사용해보자. 앞에서 tmuxinator new명령어를 보았지만 tmuxinator 명령어를 실행하면 사용 가능한 명령어를 볼 수 있다.

$ tmuxinator list
tmuxinator projects:
summernote    Atom-Angular    test-project

tmuxinator list 명령어를 실행하면 현재 설정된 프로젝트의 목록을 볼 수 있다. 원하는 프로젝트를 실행하려면 tmuxinator start test-project같은 식으로 프로젝트명을 지정하면 다음과 같이 tmux 세션이 뜨는 것을 볼 수 있다.

tmuxinator로 tmux 세션을 실행한 화면

앞에 설명한 기본 설정파일을 그대로 띄운 모습인데 YAML에 설정된 그대로 실행된 것을 볼 수 있다. 개발환경 등 사용하는 tmux 세션의 설정을 YAML로 기록해 두면 컴퓨터를 리붓하거나 다른 컴퓨터에서도 같은 설정을 명령어 하나로 실행할 수 있다.

이 외에도 tmuxinator copy EXISTING_PROJECT NEW_PROJECT로 기존 설정을 복사해서 새 프로젝트를 만들거나 tmuxinator delete PROJECT로 만들어진 프로젝트를 지울 수 있다.


tmuxinator가 하는 일은 사실 이게 전부이다. tmux 세션 설정을 관리해 주고 실행해 주는 것이 전부이지만 tmux 팬이라서 꼭 써야 할 도구일 정도로 아주 유용하다. 이제는 컴퓨터를 리붓하거나 오랜만에 다른 프로젝트를 하더라도 tmuxinator로 실행만 하면 끝나기 때문에 바로 개발에 들어갈 수 있다.

2015/09/10 04:01 2015/09/10 04:01