[Workshop] Tmux - terminal multiplexer

Tmux pozwala na przełączanie między wieloma programami (w szczególności shellem) w jednym oknie terminala. Pozwala także na odłączenie się (detach) od sesji, która nie jest ubijana a działa sobie w tle.

Jeśli masz do czynienia z serwerami (choćby nawet jako programista) to musisz znać to narzędzie (albo screena, ale wpis jest o tmuxie ;)). Zapewne nieraz Ci się zdarzyło działać coś na serwerze i nagle zerwało połączenie, a ty akurat odpalałeś bardzo_ważny_skrypt.rb i wiesz, że zerwanie połączenia ssh spowodowało ubicie go. Tmux m.in. rozwiązuje ten problem. Jeśli działałeś w ramach sesji tmuxa to zerwane połączenie ssh nie jest problemem. Po prostu wbijasz na serwer i dołączasz do poprzedniej sesji (proces działał cały czas).

Ale nie jest to jedyny powód by poznać to narzędzie.

Ja używam go także lokalnie do programowania. A używam go tak:
cd ~/work/project && bin/tmuxinator
i w efekcie w aktualnym oknie terminala odpala mi się sesja tmuxa (tmuxinator to taki gem, który pozwala na definiowanie sesji tmuxinatora per projekt), z predefiniowanymi oknami dla serwera, consoli, logtaila, mysql itp.

Jak zacząć pracę z tmuxem?

  1. Instalacja
  1. Konfiguracja
    Sporo można zmienic w konfiguracji, domyślna jest całkiem ok. Moja konfiguracja jest tutaj
    https://gist.github.com/radarek/7351777

(ctrl-A jest prefixem)

Kilka podstawowych commend z moją konfiguracją:

# wylisowanie sesji
tmux ls
# założenie nowej sesji
tmux new -s MyProject
# lub jeśli istnieje sesja o nazwie MyProject
tmux a -t MyProject

 

ctrl-A + , - zmiana nazwy obecnego okna
ctrl-A + c - nowe okno
ctrl-A + strzałka lewo/prawo - zmiana obecnego okna
ctrl-A + d - detach (sesja w tle)
ctrl-A + | - podział okna na 2 ułożone obok siebie
ctrl-A + - - podział okna na 2 ułożone jedno nad drugim
ctrl-A + x - ubicie całej sesji
  1. Linki
    https://coderwall.com/p/_g2vpq
    https://github.com/aziz/tmuxinator/ - wspomniany tool tmuxinator (obsługa plików .tmuxinator per project jest póki co tylko w masterze)
    https://learn.thoughtbot.com/products/4-humans-present-tmux - zajawka video

Jeśli macie jakieś pytania chętnie odpowiem.

1 Like

+1 dla tmuxa, idealne narzędzie. W połączeniu z jakimś tiling WM (i3) i dobrym edytorem (vim) nie trzeba odrywać rąk od klawiatury.

Ja od zawsze używałem screen’a, sprawdzę tmux’a w najbliższym czasie.

Przy okazji czym się różni screen od tmux’a:

Nie próbowałem, ale na makówkach iTerm2 ponoć bardzo ładnie wspiera tmux.

Ja używam dość intensywnie do automatycznego odpalania środowiska developerskiego danej aplikacji. Jednym aliasem/funkcją odpala mi się w tle tmux (tmux new-session -d -s ... ...) i po kolei odpala zeus start, potem rails server i dalej ewentualnie to co jest potrzebne w danym projekcie (np. solr). Bardzo wygodne i efektywne.

Coś ala:

function zt() {
  name=$(basename $PWD)
  tmux new-session -d -s "zeus-${name}" 'zsh -i -c "env $(cat .zeus-env 2> /dev/null) zeus start"'
  tmux new-window "sleep 1;zeus server"
  [ -f .zeus-run ] && cat .zeus-run|while read run; do
    tmux new-window "sleep 1;${run}"
  done
}

Chyba tmuxinator ma podobne założenia.

@mdrozdziel Tmuxinator sam tworzy takie sesje z bardziej czytelnego pliku .yml. Przykładowy plik:

name: BrainyplexSite
project_root: <%= Dir.pwd %>
pre: unset BUNDLE_GEMFILE BUNDLE_BIN_PATH RUBYOPT

windows:
  - server: bundle exec rails s
  - console: bundle exec rails c
  - devshell:
  - logs: tail -f log/development.log
  - mysql: mysql -u root brainyplex_dev

Ja polecam Ctrl-f jako prefix (i przemapowanie Ctrl na Caps lock)

I dla vimowców https://github.com/tpope/vim-dispatch z tmuxem tworzy małe IDE.

Ja od siebie dodam, że na iterm2 można sobie ustawić tak, żeby skróty klawiszowe wysyłały jakiś ciąg znaków do terminala, więcej tutaj: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

W ten sposób ustawiłem sobie, żeby między tabami w tmuxie przełączać się tymi kombinacjami, których już używałem od dawna np. cmd+{ i cmd+}. Przełączanie pomiędzy pane’ami mam załatwione cmd+jeden z kursorów. W ten sposób zaoszczędza się bardzo dużo czasu.

Co do samego tmuxa, to z jednej strony używam i lubię, a z drugiej strony czuję, że gdybym pracował nad jednym projektem, gdzie nie ma dodatkowo wielu mniejszych projektów, to raczej bym sobie dał spokój.

Ja odpalam zawsze. Raz że po to żeby nie mieć kilku tabów/okienek konsoli odpalonej, a dwa że niestety zdarzy mi się wylogować / zamknąć okno terminala i później trzeba wszystko na nowo odpalać… w tmuxie sesja przetrwa moje chaotyczne zamykanie okienek.

W sumie ciężko mi sobie wyobrazić pracę bez vima z lewej strony i ‘sidebara’ z testami po prawej…

Plus za Tmuxa Radarek, a co się stało z Twoim blogiem? Już dawno nic nowego tam nie widziałem :wink:

Dokładnie takie same mam odczucia. Przydaje się przy skakaniu pomiędzy projektami, ale pozatym już mniej. Może jeszcze tak jak hubertlepicki wspominał o pamiętaniu sesji (całkiem przydatna funkcja).

To jeszcze tip dla użytkowników combo vim + tmux: https://github.com/christoomey/vim-tmux-navigator. Pozwala uzywać tych samych skrótów klawiszowych do skakania między splitami w vimie i tmuxie.

Używającym OSX polecam używanie iTerm2 i terminala “pod-klawiszem”. Okno można sobie bardzo przyjemnie podzielić na kilka sesji i/lub używać tabów. Poza tym iTerm2 sam w sobie ma masę przydanych funkcjonalności.

Chowanie/pokazywanie pod klawiszem sprawia, że nie ma takiego bałaganu, więc szansa na to, że się coś przypadkowo zamknie maleje.