[Workshop] Tmux - terminal multiplexer


#1

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.


Mój warsztat - narzędzia, bez których nie mógłbym żyć ;-)
#2

+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.


#3

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:


#4

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


#5

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.


#6

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.


#7

@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

#8

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.


#9

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.


#10

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…


#11

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


#12

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).


#13

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.


#14

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.