tmux
Une introduction pratique ;-)
Appuyez sur [s] pour ouvrir les notes présentateur dans une nouvelle fenêtre.
Je vais essayer d'ajouter ici, pour certains slides, des points que j'ai pu donner à l'oral lors de la présentation et/ou qui ne sont pas explicitement écrits sur les slides — afin de les rendre plus utiles aux lecteurs qui n'auraient pas assisté à la présentation.
Le style sera volontairement un peu oral , se rapprochant un peu de ce qui s'est dit lors de la présentation live .
Qui ?
Ces slides ont été utilisés comme support lors d'une présentation de tmux pour
mes collègues de TEA fin 2014.
Introduction
Une petite introduction : tmux, screen, qu'est-ce qu'un Terminal Multiplexer , à quoi ça peut servir ?
tmux ?
Aujourd'hui, principalement, présentation de tmux
Version récente = 1.8
Voire même 1.9 ;-)
Terminal multiplexer
Plusieurs sessions de terminaux sur une seule session [distante]
Persistance
Plusieurs fenêtres
Partage de sessions
Persistance : on peut lancer une session depuis une machine, déconnecter, s'y rattacher depuis une autre machine et retrouver sa session.
Chaque session / fenêtre fait tourner sa propre application (on peut brancher des onglets ) et a son propre buffer de scrollback.
Plusieurs sessions peuvent être lancées sur la même machine et plusieurs utilisateurs peuvent contrôler la même session.
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 ;-)
La déconnexion peut être voulue... ou non...
Et quand elle n'était pas voulue, on est content de retrouver sa session ; et que les programmes en cours n'aient pas été interrompus !
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
Screen : 1ère version en 1987
Tmux : 1ère version en 2009. Inclu de base dans OpenBSD ; disponible sur les repos des distributions Linux
Tmux a un mode souris
Configuration de screen = infernal ^^
La première grosse différence = la touche de commande...
Notions de base
Quelques notions de base
Session / Window / Pane
Lancer, détacher, attacher + sessions nommées
Cible : tmux >= 1.8
Session
Lancer une nouvelle session
$ tmux
$ tmux new -s NOM_SESSION
Tout se fait au sein d'une session.
La lancer est donc un peu une étape obligatoire
Quitter une session
Quitter tous les programmes exécutés dans la session
Shell bash
: exit
ou Ctrl + D
Si plus aucun programme ne tourne dans la session, elle n'a plus de raison d'être.
Le shell (bash / zsh / ...) est un programme ;-)
Pour quand on aura parlé des commandes : :kill-session
Touche de commande
Nombreuses commandes
Raccourcis clavier : CMD + TOUCHE
Par défaut : Ctrl + B + TOUCHE
Pour éviter d'interférer avec d'autres programmes : on ne peut pas juste jouer des raccourcis clavier, il faut les introduire – jouer une combinaison de touches.
Touche de commande
Souvent remappée
Ctrl + A + TOUCHE
Ctrl + A était la touche de commande de screen
.
Elle est souvent utilisée sous tmux, notamment par ceux qui avaient utilisé screen
auparavant.
Peut-être un risque de conflit avec vim ?
Touche de commande
Pour la suite de cette présentation
CMD + TOUCHE
Pour éviter le débat Ctrl + B/A, utilisons CMD dans la suite de ces slides ^^
Avec CMD qui vaut Ctrl + B ou Ctrl + A , selon votre configuration.
Historique
Mode "texte", pas de molette pour scroller.
CMD + [
Page-Up
Page-Down
Quitter : q
Nous verrons plus loin qu'il existe un mode souris , qui permet de scroller (notamment) à la souris.
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 !
Importance de penser à fermer les sessions inutiles (et pas juste les détacher), pour éviter d'avoir 36k trucs qui tournent sans que personne ne les voit.
Y compris quand on a été déconnecté : reconnecter, rattacher, tout fermer.
Lister les sessions
$ tmux list-sessions
$ tmux ls
Aucune session,
ou une session
ou plusieurs sessions ;-)
Ou aussi la commande :list-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
Ferme tous les programmes qui s'exécutaient dans la session, puis ferme la session elle-même.
Naviguer entre sessions
CMD + s
Affiche un menu qui permet de choisir la session qu'on veut.
On peut aussi renommer la session courante, avec CMD + $ , si on ne l'avait pas nommée lors de sa création.
Commandes
CMD + : COMMANDE
Exemples :
:set status-bg white
:set-option history-limit 16000
:set -g prefix C-a
:bind-key C-a last-window
Pas mal de commandes peuvent être utilisées directement avec le programme tmux
, comme :list-sessions
.
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 !
On peut faire plein de choses qui vont plus loin, mais en les apprenant sur le tas au fur et à mesure de l'usage.
Imprimer une cheat-sheet avec les raccourcis claviers utiles et la garder pas loin du clavier peut aider ;-)
Sessions, Fenêtres et panneaux
Pour l'instant, on a fait simple en ne manipulant que de sessions. Mais une session permet d'avoir bien plus qu'un seul programme actif.
Imbrication
Plusieurs sessions
Contenant plusieurs fenêtres (windows)
Contenant plusieurs panneaux (panes)
Bien sûr, libre à chacun d'utiliser ou non plusieurs windows et de positionner ou non plusieurs panes dedans.
Désolé, j'emploirai de façon un peu mélangée les termes window et pane et leurs traductions françaises.
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
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"
1 window "root"
1 window monitoring : htop + nethogs + dstat
1 window project backend : commandes + tig
1 window mysql
1 window "root"
1 window monitoring : htop + nethogs + dstat
1 window project backend : commandes + tig
1 window mysql
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"
1 window "root"
1 window monitoring : htop + nethogs + dstat
1 window project backend : commandes + tig
1 window mysql
Windows
Nouvelle : CMD + C
Renommer : CMD + ,
Liste : CMD + w
Le premier sert souvent.
Le deuxième plus rarement, parce qu'on peut configurer tmux pour que les windows prennent le nom de leurs programmes en cours.
Le dernier à peu près jamais : les windows sont souvent affichées, un peu sous forme d'onglets.
Windows
Sélectionner : CMD + NUMERO
Précédente : CMD + p
Suivante : CMD + n
Précédemment active : CMD + l
Marche bien quand les numéros vont de 0 à 9 – ou de 1 à 9 si on a re-paramétré la numérotation pour correspondre à un clavier.
Précédemment active est souvent remappée en CMD + a ou même en CMD + CMD-a
Windows
Mes raccourcis
Droite : MAJ + →
Gauche : MAJ + ←
Avec les windows représentées sous forme d'onglets en bas de l'écran, je trouve ça plus intuitif.
Même si j'utilise parfois CMD + NUMERO pour aller loin d'un côté ou de l'autre.
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.
Oui, ça fait un peu beaucoup pour être réellement pratique... C'est uniquement un exemple ^^
En général, je me limite à deux panes, même sur un grand écran, parce que j'aime avoir de la place – sauf quand il s'agit de monitorer plusieurs programmes / logs (en avoir plusieurs à la fois sous les yeux peut être pratique).
Panes
Découpage horizontal :
CMD + %
CMD + - (ma config)
Découpage vertical :
CMD + "
CMD + | (ma config)
% et " ne sont pas tellement instinctifs ...
Alors que - et | sont tellement plus logiques !
Et avec - et |, les deux types de découpages sont accessibles par la même touche du clavier (sur PC azerty, du moins).
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
En pratique, je n'utilise jamais ces raccourci, je préfére les miens .
Panes
Mes raccourcis
Droite : Alt + →
Gauche : Alt + ←
Haut : Alt + ↑
Bas : Alt + ↓
Donc, avec ma configuration, c'est MAJ+flèches pour les windows et Alt+flèches pour les panneaux.
Panes
Break : CMD + !
Bascule full-window : CMD + z
Déplacer un pane vers gauche / droite : CMD + { / }
Break pane = en faire sa propre window.
Basculer (temporairement) un panneau en plein écran est pratique pour sélectionner à la souris sans avoir la barre de séparation de panneux ou les autres panneaux qui se retrouvent aussi sélectionnés.
Panes
Redimensionner
: resize-pane -R 10
: resize-pane -L 10
: resize-pane -U 10
: resize-pane -D 10
Ca peut être mappé vers des raccourcis comme CMD + < ou CMD + >
Un peu plus ?
En gros, ce qu'il faut savoir pour un usage standard ⇒ cf plus haut !
Un peu de configuration, fichier .tmux.conf
Quelques commandes : redimensionnement, automatisations, ...
À l'aide ?
Affiche la liste des raccourcis clavier actuellement branchés.
Il y en a un sacré paquet ;-)
.tmux.conf
Fichier de configuration par défaut
Sinon :
tmux -f ~/.tmux.conf [new / attach / ...]
Contient des commandes.
Les mêmes que celles utilisables via CMD + : COMMANDE
Mon conseil : partir d'un fichier pas trop long et l'enrichir au fur et à mesure, en ne prenant que des choses dont on a besoin / qu'on utilise.
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
Avec pas mal de morceaux copiés ici et là depuis Internet, au fil de l'utilisation.
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
...
Bref, il y a plein de commandes.
Quand vous aurez fait le tour des trucs de base, lisez la doc ;-)
Mais encore ?
On peut aller bien plus loin
screencast à base de tmux
tmuxinator
plugins divers
Ré-affecter des windows / panes ?
Mode mouse ?
Manipulations avancées
Une multitude de possibilités !
Déplacement de windows
Déplacement de panes
Transformation de windows en panes / inversement
...
Je n'en parle plus que ça : quand vous en serez là, vous trouverez comment faire (et je n'utilise quasiment jamais non plus).
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
Certains raccourcis, comme le / pour rechercher, dépendent du mode : en mode vi on recherche avec / alors qu'en mode emacs on recherche avec Ctrl + s
Les raccourcis sont différents en mode emacs .
Commandes : list-buffers
, show-buffer -b X
, paste-buffer -b X
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
Crée une session (détachée) nommée mine
.
Crée quelques windows (d'ids 1 à 3) et y lance des commandes.
Tape une instruction dans la window d'id 3.
Sélectionne la window d'id 3.
Attache la session.
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
Détermine si la session existe
Si elle n'existe pas :
Crée la session
Y ouvre quelques windows
En sélectionne une
Attache la session
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'
Cf cet article
Pratique pour activer quand on en a besoin (pour redimensionner facilement des panes, par exemple) et désactiver quand on veut copier-coller par sélection + middle-clic.
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.
Utile si vous éteignez fréquemment votre PC et voulez pouvoir toujours relancer la même session, contenant les mêmes windows et mêmes panes, organisés de la même manière.
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 new demo
tmuxninator start demo
Astuce : :list-windows
pour obtenir les layouts
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 new demo
tmuxninator start demo
Astuce : :list-windows
pour obtenir les layouts
tmuxinator
Lancer la session demo
tmuxinator start demo
ou
mux start demo
Quelques autres commandes, je n'en parlerai pas plus, cf doc.
Plugins
github.com/tmux-plugins
Gestionnaire de plugins
Quelques plugins
Options sensible .
Copie vers le presse-papier système.
Sauvegarde / restauration
...
Là aussi, je ne fais qu'évoquer l'idée, faites un tour sur la liste de plugins existant pour voir ce qu'ils permettent et comment les installer / utiliser.
Au final ?
J'ai fait le tour de tout ce que je voulais dire.
Avec une présentation des fonctionnalités de base, mais aussi de points plus avancés.
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 !