tmux

Une introduction pratique ;-)

Appuyez sur [s] pour ouvrir les notes présentateur dans une nouvelle fenêtre.

Qui ?

Introduction

tmux ?

Terminal multiplexer

  • Plusieurs sessions de terminaux sur une seule session [distante]
  • Persistance
  • Plusieurs fenêtres
  • Partage de sessions

Usage classique

  • SSH
    • lancement de tmux
    • travail
  • Déconnexion.
  • Re-connexion SSH
    • on retrouve la session tmux
  • SSH depuis une autre machine : idem !
  • Marche aussi en local ;-)

GNU Screen ?

  • Stable
  • Fonctionnalités reprises / améliorées par Tmux
    • Quelques trucs avancés
    • Configuration vraiment plus simple
  • Mais
    • Tmux n'est pas un remplacement drop-in
    • Commandes différentes

Notions
de base

Session

Lancer une nouvelle session


$ tmux
                    

$ tmux new -s NOM_SESSION
                    

Quitter une session

  • Quitter tous les programmes exécutés dans la session
  • Shell bash : exit ou Ctrl + D

Touche de commande

  • Nombreuses commandes
  • Raccourcis clavier : CMD + TOUCHE
  • Par défaut : Ctrl + B + TOUCHE

Touche de commande

Souvent remappée

Ctrl + A + TOUCHE

Touche de commande

Pour la suite de cette présentation

CMD + TOUCHE

Historique

  • Mode "texte", pas de molette pour scroller.
  • CMD + [
    • Page-Up
    • Page-Down
    • Quitter : q

Détacher une session

CMD + d

  • Détache le terminal de la session tmux.
  • La session continue son exécution en arrière-plan.
  • Les programmes continuent leur exécution !

Lister les sessions


$ tmux list-sessions
                    

$ tmux ls
                    
  • Aucune session,
  • ou une session
  • ou plusieurs sessions ;-)

Attacher une session


$ tmux attach
                    

$ tmux attach -t NOM_SESSION
                    

$ tmux a [-t NOM_SESSION]
                    
  • Attache le termination à une session tmux.
  • On retrouve la session !
  • Plusieurs terminaux – et plusieurs personnes – peuvent être attachés à la même session !

Tuer une session


$ tmux kill-session -t NOM_SESSION
                    

Naviguer entre sessions

CMD + s

Commandes

CMD + : COMMANDE

Exemples :


:set status-bg white
:set-option history-limit 16000

:set -g prefix C-a
:bind-key C-a last-window
                    

Bilan

  • Vous savez lancer une session (y compris nommée).
  • La détacher / ré-attacher.
  • La fermer pour de bon.
  • C'est suffisant pour commencer à utiliser tmux !

Sessions,
Fenêtres
et panneaux

Imbrication

  • Plusieurs sessions
  • Contenant plusieurs fenêtres (windows)
  • Contenant plusieurs panneaux (panes)

Session

  • Ce à quoi on attache un terminal.
  • Peut être attachée par plusieurs personnes en même temps.
  • Contient une ou plusieurs window(s).
  • Usage : un thème global
    • "travail"
    • "perso"
    • "r&d"

Window

  • Correspond à un affichage, plein écran.
  • Souvent assimilé à un onglet
    • car représenté comme tel par défaut
  • Contient un ou plusieurs pane(s).
  • Usage : un projet au sein du thème
    • "backend"
    • "temp"
    • "exploitation"

Pane

  • La plus petite unité, une portion d'une window et de l'affichage.
  • On travaille toujours dans un pane.
  • Un ou plusieurs pane(s) par window.
  • Usage : une vue du projet
    • "historique git"
    • "error_log"
    • "acces_log"

Windows

  • Nouvelle : CMD + C
  • Renommer : CMD + ,
  • Liste : CMD + w

Windows

  • Sélectionner : CMD + NUMERO
  • Précédente : CMD + p
  • Suivante : CMD + n
  • Précédemment active : CMD + l

Windows

Mes raccourcis

  • Droite : MAJ +
  • Gauche : MAJ +

Windows

  • Tuer : CMD + &
  • Déplacer : CMD + . (demande de numéro)
  • Déplacer : CMD + :move (déplace au prochain numéro libre)

Panes

  • Plusieurs panes dans une window.
  • Découpage horizontal ou vertical.
  • Taille réglable.

Panes

  • Découpage horizontal :
    • CMD + %
    • CMD + - (ma config)
  • Découpage vertical :
    • CMD + "
    • CMD + | (ma config)

Panes

  • Naviguer : CMD + o
  • Par numéros : CMD + q + NUM
  • Tuer : CMD + x
  • Différents layouts : CMD + ESPACE
  • Left / Down / Up / Right : CMD + h / j / k / l

Panes

Mes raccourcis

  • Droite : Alt +
  • Gauche : Alt +
  • Haut : Alt +
  • Bas : Alt +

Panes

  • Break : CMD + !
  • Bascule full-window : CMD + z
  • Déplacer un pane vers gauche / droite : CMD + { / }

Panes

Redimensionner

  • : resize-pane -R 10
  • : resize-pane -L 10
  • : resize-pane -U 10
  • : resize-pane -D 10

Un peu plus ?

À l'aide ?

  • Raccourcis : CMD + ?

.tmux.conf

  • Fichier de configuration par défaut
    • ~/.tmux.conf
  • Sinon :
    • tmux -f ~/.tmux.conf [new / attach / ...]
  • Contient des commandes.
    • Les mêmes que celles utilisables via CMD + : COMMANDE

Mon .tmux.conf

gist.github.com/pmartin/1b35fc2214b9cac8f205


# Bindings de keys
set -g prefix C-a
set-window-option -g mode-keys vi
bind-key C-a last-window

# Changement de fenêtre avec Maj + Flèches
bind -n S-Left previous-window
bind -n S-Right next-window
                    

Mon .tmux.conf

gist.github.com/pmartin/1b35fc2214b9cac8f205


# Changement de panneau avec raccourcis style Vi
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Changement de panneau avec Alt + Flèches
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
                    

Mon .tmux.conf

gist.github.com/pmartin/1b35fc2214b9cac8f205


# Splitting de window : vertical avec | et horizontal avec -
unbind %
bind | split-window -h
bind - split-window -v 

# Longueur de l'historique
set-option history-limit 16000
                    

Mon .tmux.conf

gist.github.com/pmartin/1b35fc2214b9cac8f205


# Status bar
set-option -g status-justify "centre"

set -g status-fg white
set -g status-bg black

set -g status-left '#H#[default]'
set -g status-left-fg white
set -g status-left-bg blue

set -g status-right '#[fg=yellow,bold]#(cut -d " " -f 1-4 /proc/loadavg)#[default] #[fg=cyan,bold]%Y-%m-%d %H:%M:%S#[default] '
set -g status-right-fg white

set-window-option -g window-status-current-fg white
set-window-option -g window-status-current-bg red
                    

Mon .tmux.conf

gist.github.com/pmartin/1b35fc2214b9cac8f205


# Set window notifications
setw -g monitor-activity off
set -g visual-activity off

# Automatically set window title
set-window-option -g automatic-rename on
set-option -g set-titles on
                    

Mon .tmux.conf

Je l'ai déployé sur tous nos serveurs sur lesquels je sois passé ;-)

Autres commandes

  • :list-windows
  • :find-window TEXTE / CMD + f
  • ...

Mais encore ?

Manipulations avancées

Une multitude de possibilités !

  • Déplacement de windows
  • Déplacement de panes
  • Transformation de windows en panes / inversement
  • ...

Rechercher, copier, coller

Mode copie : CMD + [

  • Rechercher : / + ENTER
  • Sélectionner : SPACE puis flèches
  • Copier : ENTER
  • Coller : CMD + ]

Raccourcis valables en mode vi :


:set-window-option -g mode-keys vi
                    

Scripting

Commande tmux depuis un shell


tmux new-session -d -s mine

tmux new-window -t mine:1 -n 'root' 'sudo -s'
tmux new-window -t mine:2 -n 'monitoring' 'htop'
tmux new-window -t mine:3 -n 'projects' 'bash'

tmux send-keys -t mine:3 'cd ~/developpement' C-m

tmux select-window -t mine:3
tmux -2 attach-session -t mine
                    

Scripting

Créer ou attacher une session


#!/bin/bash
NAME='pmn'

tmux has-session -t $NAME 2>/dev/null
if [[ $? -eq 1 ]]; then
    tmux new-session -d -s $NAME
    
    tmux new-window -t $NAME:1 -n 'first' 'bash'
    tmux new-window -t $NAME:2 -n 'second' 'bash'
    
    tmux send-keys -t $NAME:0 'cd ~/developpement' C-m
    
    tmux select-window -t $NAME:0
fi
tmux attach-session -t $NAME
                    

Mouse mode

  • Scroll
  • Redimensionnement de panes
  • Sélection de window / pane

set -g mode-mouse on
set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on 
                    

Mais : interfère avec sélectionner + middle-clic

Mouse mode

Mapping pour activer / désactiver


# Toggle mouse on with ^B m
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'
 
# Toggle mouse off with ^B M
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'
                    

tmuxinator

github.com/tmuxinator/tmuxinator

  • Création de sessions depuis un fichier de configuration.
  • Liste de windows / panes.
  • Commandes à lancer dans chaque.
  • Pratique pour toujours lancer la même session.

tmuxinator

~/.tmuxinator/demo.yml (1/2)


name: demo
root: ~/

windows:
  - root: sudo -s
  - monitoring: 
      layout: 37d4,153x44,0,0{71x44,0,0,32,81x44,72,0[81x22,72,0,35,81x21,72,23,36]}
      panes:
        - htop
        - sudo nethogs wlan0
        - dstat
...
                    

tmuxinator

~/.tmuxinator/demo.yml (2/2)


...
  - backend:
      layout: c6f6,153x44,0,0{91x44,0,0,33,61x44,92,0,37}
      panes:
        - cd ~/projects/backend
        - tig:
          - cd ~/projects/backend
          - tig
  - mysql: 
      layout: main-horizontal
      panes:
        - mysql --user=platnum --password=platnum --host=tea-db platnum
        - mysql --user=warehouse --password=warehouse --host=tea-db warehouse
                    

tmuxinator

Lancer la session demo


tmuxinator start demo
                    

ou


mux start demo
                    

Plugins

github.com/tmux-plugins

  • Gestionnaire de plugins
  • Quelques plugins
    • Options sensible.
    • Copie vers le presse-papier système.
    • Sauvegarde / restauration
    • ...

Au final ?

Tmux, c'est bien !

  • On retrouve sa session en cas de déconnexion.
  • Peu de raccourcis à connaître pour commencer.
  • ("mon") .tmux.conf facilite ceux-ci.
  • Usage plus avancé possible.
  • Je ne m'en passe plus !

TEA, décembre 2014 — Présentation tmux — Pascal MARTIN, @pascal_martin