tmux : un remplaçant à screen ?

Billet posté le 8 août 2012

Introduction

Il vous est arrivé d’avoir besoin de lancer une commande sur une plateforme Unix / Linux et que celle-ci continue à s’exécuter alors que vous n’êtes plus connecté à votre terminal ?

Des exemples :

  • une copie de plusieurs centaines de Go
  • une session IRC (idle à fond)
  • exécuter une commande en permanence
  • autres

Bref, il existe des solutions de la plus mauvaise à la plus sympa. Je propose ci-dessous d’en donner quelques exemples non exhaustifs.

On peut citer le caractère “&” qui permet d’exécuter une commande en arrière plan (background quoi).

Exemple :

find . -iname '*.mp3' -print > /tmp/toto &

Il est aussi possible d’utiliser la commande “nohup”.

Exemple :

nohup find . -iname '*.mp3' -print > /tmp/toto &

On notera que finalement pour les deux exemples ci-dessus on utilise le signe ‘&’ qui permet donc d’exécuter une commande en arrière plan. La dernière commande se différencie par l’utilisation de “nohup” car cela permet de continuer l’exécution de la commande même si la connexion du terminal se coupe.

Du coup y a quoi de révolutionnaire ?

Le besoin

Il existe deux commandes très sympa qui permettent d’aller plus loin et de récupérer un terminal même lorsqu’il est détaché.

Un terminal peut être détaché pour plusieurs raisons :

  • coupure réseau vers le serveur
  • pas besoin de garder le terminal ouvert, vous en avez plus besoin mis à part la commande qui s’exécute
  • liste non exhaustive

Nous pouvons citer les commandes screen et tmux.

Screen

Rapidement : screen est une commande qui vous permet de faire énormément de choses. Les principales caractéristiques sont d’avoir des terminaux en grand nombre, de naviguer facilement entre eux, et de pouvoir détacher les sessions et les reprendre dès qu’il y en a besoin.

Vous trouverez ci-dessous mon fichier $HOME/.screenrc

# My Shell - the one and only ;)
#shell                 zsh

# When  any  activity  occurs in a background window that is being
# monitored, screen displays  a  notification  in  the message  line.
# There are also some specials like embedded branches (with %?),
# color codes (with %{xy}) and padding (with %=, %<;;, %>;;).
# you can find their description in the manual in section
# "STRING ESCAPES":
# activity              "%C ->;; %n%f %t activity!"
activity '*knock* *knock* Wake up ... window %n'

# I use F8/F9 to change the windows
bindkey -k k9 next
bindkey -k k8 prev
bindkey -k k1 screen
bindkey -k k4 detach

defutf8 on # nouvelles fenêtres en utf-8
#utf8 on on # mode utf-8-aware dans les deux sens

Un successeur pourquoi faire ?

Donc pour expliquer un peu plus en avant j’ai utilisé pendant des années le programme screen.

Puis en discutant avec @Mat_A via twitter il m’a suggéré d’utiliser le programme tmux.

Ma réaction ? “Euh ouais enfin screen ça me convient très bien, j’ai mes habitudes tout ça.”

Bref, j’ai fais un joli

apt-get install tmux

Quelques commandes de base

Ca y est le package tmux est installé. On fait quoi maintenant ?

Une bonne idée serait de lire la doc (RTFM), ou alors on regarde vite fait à l’arrache ce qu’on peut faire.

Non hein finalement l’idée de regarder la doc est pas si mal que ça.

Par défaut avec screen on est habitué à utiliser le raccourci clavier ctrl-a puis une touche.

Par défaut avec tmux c’est le raccourci clavier ctrl-b puis une touche. Franchement relou hein. Surtout quand depuis des années on utilise le même raccourci clavier.

tmux vous simplifie la vie et vous livre un fichier tmux.conf qui permet de remapper tous les raccourcis claviers ctrl-b en ctrl-a. Plutôt sympa non ?

Je vous livre ce fichier ainsi que les quelques modifications que j’ai apporté à ce fichier :

# $Id: screen-keys.conf,v 1.5 2009/10/25 21:58:05 nicm Exp $
#
# By Nicholas Marriott. Public domain.
#
# This configuration file binds many of the common GNU screen key bindings to
# appropriate tmux key bindings. Note that for some key bindings there is no
# tmux analogue and also that this set omits binding some commands available in
# tmux but not in screen.
#
# Note this is only a selection of key bindings and they are in addition to the
# normal tmux key bindings. This is intended as an example not as to be used
# as-is.

### Unbind existing tmux key bindings (except 0-9).

# Set the prefix to ^A.
unbind C-b
set -g prefix ^A
bind a send-prefix

# Bind appropriate commands similar to screen.
# lockscreen ^X x
unbind ^X
bind ^X lock-server
unbind x
bind x lock-server

# screen ^C c
unbind ^C
bind ^C new-window
bind c
bind c new-window

# detach ^D d
unbind ^D
bind ^D detach

# displays *
unbind *
bind * list-clients

# next ^@ ^N sp n
unbind ^@
bind ^@ next-window
unbind ^N
bind ^N next-window
unbind " "
bind " " next-window
unbind n
bind n next-window

# title A
unbind A
bind A command-prompt "rename-window %%"

# other ^A
unbind ^A
bind ^A last-window

# prev ^H ^P p ^?
unbind ^H
bind ^H previous-window
unbind ^P
bind ^P previous-window
unbind p
bind p previous-window
unbind BSpace
bind BSpace previous-window

# windows ^W w
unbind ^W
bind ^W list-windows
unbind w
bind w list-windows

# quit \
unbind \
bind \ confirm-before "kill-server"

# kill K k
unbind K
bind K confirm-before "kill-window"
unbind k
bind k confirm-before "kill-window"

# redisplay ^L l
unbind ^L
bind ^L refresh-client
unbind l
bind l refresh-client

# split -v |
unbind |
bind | split-window

# :kB: focus up
unbind Tab
bind Tab down-pane
unbind BTab
bind BTab up-pane

# " windowlist -b
unbind '"'
bind '"' choose-window

bind -n F1 new-window
bind -n F8 previous-window
bind -n F9 next-window

Les plus de tmux

J’apprécie énormément de modifier le fichier de configuration de tmux à la volée ! C’est vraiment très pratique. Lorsque vous modifier votre fichier de configuration $HOME/.tmux.conf vous pouvez alors reloader la conf par la commande suivante :

tmux source-file ~/.tmux.conf

Les inconvénients de tmux

Je dirais qu’il n’est pas forcément disponible sur toutes les plateformes. Le site officiel de tmux ainsi que d’autres sites

http://tmux.sourceforge.net/

http://en.wikipedia.org/wiki/Tmux

http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer/

http://linux-attitude.fr/post/configuration-de-tmux

Conclusion

Ça juste marche. Le principal problème reste donc le changement d’habitude.On a la même facilité qu’avec screen. Et si on remappe le clavier c’est plus facile ;-)

Personnellement je l’ai adopté assez rapidement.