Vous avez découvert tmux dans la leçon 27. screen est le multiplexeur de terminal historique, présent sur почти tous les systèmes Unix bien avant tmux. Si tmux n'est pas installé ou si vous devez travailler sur une machine distante ancienne, screen sera votre allié. Il offre les mêmes fonctions essentielles : maintenir des sessions persistantes, diviser l'écran, et reprendre votre travail après une déconnexion.
screen introduit la notion de session — un processus qui tourne en arrière-plan et qui peut abriter plusieurs fenêtres (window). Chaque fenêtre est un pseudo-terminal (pty). Vous pouvez vous détacher (detach) de la session et la retrouver plus tard, même après vous être déconnecté.
# Lancer une session screen nommée
screen -S travail
# Lancer une session screen sans nom (génère un identifiant Anonymous)
screen
# Lister les sessions screen actives
screen -ls
# Se rattacher à une session détachée
screen -r travail
# Se rattacher à une session même si elle est encore attachée ailleurs
screen -d -r travail
# Forcer le détachement d'une session active
screen -d travail
# Créer une session et l'exécuter en mode détaché (créer et quitter)
screen -dmS backup_session "backup.sh"Le principe central de screen : vous vous attachez (attach) à une session. Vous pouvez vous détacher (detach) pour libérer le terminal. La session continue de tourner en arrière-plan. Plus tard, vous vous rattachez.
# Dans une session screen, taper :
Ctrl+A D # Détacher et revenir au shell d'origine
# Vous revenez à votre shell normal. La session screen continue.
# Plus tard, pour revenir :
screen -r
# Si plusieurs sessions, préciser le nom ou le PID :
screen -ls
# There are screens on:
# 2205.travail (Detached)
# 3317.dev (Attached)
screen -r travailscreen s'utilise avec des combinaisons de touches commençant par Ctrl+A (prefix). Par défaut, Ctrl+A suivi de la commande. tmux utilise Ctrl+B comme préfixe — screen utilise Ctrl+A pour ne pas interférer avec le comportement natif du terminal.
| Combinaison | Fonction |
|---|---|
Ctrl+A D | Détacher (detach) — quitter screen sans fermer les fenêtres |
Ctrl+A ? | Afficher l'aide et la liste des raccourcis |
Ctrl+A C | Créer une nouvelle fenêtre |
Ctrl+A K | Fermer la fenêtre courante (kill) |
Ctrl+A " | Afficher la liste des fenêtres et basculer |
Ctrl+A 0-9 | Aller à la fenêtre numérotée 0-9 |
Ctrl+A Ctrl+A | Revenir à la fenêtre précédente |
Ctrl+A N | Fenêtre suivante (next) |
Ctrl+A P | Fenêtre précédente (previous) |
Ctrl+A [ | Mode copie/scrollback — naviguer avec les flèches |
Ctrl+A ] | Coller le texte copié en mode copie |
Ctrl+A S | Diviser horizontalement (split horizontal) |
Ctrl+A | | Diviser verticalement (split vertical) |
Ctrl+A TAB | Passer d'un split à l'autre |
Ctrl+A Q | Fermer tous les splits sauf le courant |
Ctrl+A X | Fermer le split courant |
Ctrl+A : | Ouvrir la ligne de commande screen |
Ctrl+A d | Détacher (même que Ctrl+A D, minuscule) |
Ctrl+A Z | Mettre en pause screen (sleep temporaire) |
Ctrl+A M | Surveiller l'activité de la fenêtre courante |
Ctrl+A _ | Surveiller le silence (silence) de la fenêtre courante |
# Créer une nouvelle fenêtre dans la session
Ctrl+A C
# Afficher la liste et choisir
Ctrl+A "
# Basculer rapidement à la fenêtre 2
Ctrl+A 2
# Revenir à la fenêtre précédente
Ctrl+A Ctrl+A
# Renommer la fenêtre courante (plus lisible dans la liste)
Ctrl+A A # Puis taper le nom
# Vider l'historique de scrollback de la fenêtre courante
Ctrl+A H # Active/désactive le logging dans un fichier screenlog.XLe mode copie permet de naviguer dans le scrollback (l'historique visible de la fenêtre) et de copier du texte :
# Entrer en mode copie
Ctrl+A [
# Navigation (vim-style) :
h/j/k/l # Flèches (h=gauche, j=haut, k=bas, l=droite)
Ctrl+B # Page précédente (page up)
Ctrl+F # Page suivante (page down)
0 / $ # Début/fin de ligne
w / b # Mot suivant/précédent
/ ou ? # Rechercher en avant/arrière
n # Répéter la dernière recherche
g / G # Début/fin du scrollback
# Copier :
Espacement # Marquer le début de la sélection
Espacement # Marquer la fin (copier)
# Quitter le mode copie :
Esc# Diviser horizontalement (zone du haut/bas)
Ctrl+A S
# Diviser verticalement (zone gauche/droite)
Ctrl+A |
# Passer au split suivant
Ctrl+A TAB
# Fermer le split courant
Ctrl+A X
# Fermer tous les splits sauf le courant
Ctrl+A Q
# Créer une fenêtre dans le split courant
Ctrl+A C # Crée et place dans le split actif
# Exemple : créer un écran avec deux terminaux côte à côte
# 1. Ctrl+A | (split vertical)
# 2. Ctrl+A TAB (aller dans le nouveau split)
# 3. Ctrl+A C (créer une fenêtre)
# → Vous avez deux terminaux visibles simultanémentLe fichier ~/.screenrc configure le comportement par défaut de screen. Voici un exemple complet :
# ~/.screenrc — Configuration screen
# Définir le préfixe (par défaut Ctrl+A, certains préfères Ctrl+T)
escape ^Tt
# Barre de statut en bas (hardstatus)
hardstatus alwayslastline
hardstatus string '%{= kc}%-Lw%{+b cl}%n%f %t%{= ck}%{-b cl}%+Lw%?%?%?%?%?%?%?%?%?%= (%d/%m/%Y %c:%s)'
# Titre automatique des fenêtres (nom de la commande)
settitle on
# Ne pas afficher le message de démarrage
startup_message off
# Activer le scrollback à 10000 lignes
defscrollback 10000
# Mode UTF-8
defutf8 on
# Écran de login : garder la session après déconnexion
deflogin on
# Couleur de la barre de statut
hardstatus alwayslastline
hardstatus string '%{= kW}%-Lw%{= wk}%n* %t%{= kW}%+Lw%=%{= KW}%H %{= kR}%C%A %D %M/%d'
# Écran de veille désactivé (éviter le blank)
blankerprg ""
idle 0
# Allouer un terminal larger (pour tmux-like scroll)
termcapinfo xterm* ti@:te@
# Vouloir_voir les touches disponibles?
#escape ^Tt
#bindkey -k F1 help# ~/.screenrc minimaliste mais efficace
escape ^Tt
startup_message off
hardstatus alwayslastline
hardstatus string '%{= kc}%?%-Lw%?%{r}%n*%f %t%?%?%u%?%? %{c}%?%+Lw%?%?%= %d/%m %c:%s'
defscrollback 5000
settitle onScreen peut vous alerter quand une fenêtre affiche quelque chose pendant que vous êtes dans une autre fenêtre — très utile pour les scripts longs ou les téléchargements :
# Activer la surveillance sur la fenêtre courante (silence)
Ctrl+A _ # Émet une notification quand la fenêtre redevient silencieuse
# Activer la surveillance sur la fenêtre courante (activité)
Ctrl+A M # Émet une notification quand il y a de l'activité
# Afficher les fenêtres surveillées
screen -X hardstatusScreen peut enregistrer tout ce qui passe dans une fenêtre dans un fichier :
# Activer le log de la fenêtre courante
Ctrl+A H
# Crée screenlog.0 dans le répertoire de lancement
# Avec la configuration .screenrc, le log est permanent :
logfile /var/log/screen/session.$HOSTNAME.log
log on
# Loguer depuis la ligne de commande (sans entrer dans screen)
screen -dmS monitoring "tail -f /var/log/syslog"
screen -S monitoring -X logfile /var/log/my_session.log
screen -S monitoring -X log onscreen -S session -X commande envoie une commande à une session sans s'attacher :
# Envoyer du texte à une fenêtre
screen -S travail -X stuff "ls -la\n"
# Simuler l'appui sur Entrée
screen -S travail -X stuff $'\n'
# Envoyer Ctrl+C (tuer le processus courant)
screen -S travail -X stuff $'\003'
# Exécuter une commande dans une fenêtre spécifique
screen -S travail -p 0 -X stuff "cd /tmp\n"
screen -S travail -p 0 -X exec ls -la
# Lister les processus dans la session
screen -S travail -Q @echoQuand vous lancez un script ou un serveur, un titre explicite aide à s'y retrouver :
# Dans le shell, définir le titre :
PROMPT_COMMAND='echo -ne "\033]0;Mon Serveur\007"'
# Via .bashrc pour screen :
echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"
# Dans .bashrc avec screen-aware :
case "$TERM" in
screen*)
PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/} (screen)\007"'
;;
*)
PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}\007"'
;;
esac
# Via screen directement (titre de la fenêtre screen) :
screen -T xterm -S work -t "Shell Principal" bash# Activer l'écran de veille (blanker) après 5 minutes
blankerprg "cmatrix"
idle 300 blanker
# Verrouiller la session screen avec un mot de passe
Ctrl+A X
# Tapez le mot de passe. Pour la supprimer :
# Ctrl+A :passwd
# Changer le mot de passe screen :
Ctrl+A :password# ~/.screenrc — Raccourcis personnalisés
# Haut : nouvelle fenêtre
bind c screen -t SHELL
# Tab : prochain split
bind ^i focus
# Flèche : prochain split (comme tmux)
bindkey "^[O" focus
# g : aller au début de l'historique (copy mode)
bind g eval "copy" "stuff \'g\'"
# Créer un split et y lancer htop
bind h split -v ; focus ; screen -t htop htop
# Quitter screen cleanly (tuer toutes les fenêtres)
bind q killScreen permet à plusieurs terminaux de se rattacher à la même session simultanément (multi-attach) — pratique pour collaborer à distance :
# Activer le multi-attach sur une session
# Dans la session screen, taper :
Ctrl+A :multiattach on
# Ou depuis la ligne de commande :
screen -S colab -X multiattach on
# Permettre à quiconque de se rattacher :
chmod 777 /var/run/screen/S-$USER/
# Se rattacher depuis une autre machine :
ssh user@serveur
screen -r colab| Fonction | screen | tmux |
|---|---|---|
| Split d'écran | Oui (Ctrl+A S) | Oui (Ctrl+B ") |
| Sessions nommées | Oui (-S nom) | Oui (-s nom) |
| Detach/attach | Oui | Oui |
| Barre de statut | hardstatus | status bar |
| Config file | ~/.screenrc | ~/.tmux.conf |
| Préfixe par défaut | Ctrl+A | Ctrl+B |
| Mode copie | Vi (par défaut) | Vi (par défaut) |
| Gestionnaire de fenêtres | Non | Layouts automatiques |
| Compatibilité | Présent sur toutes les distributions | Plus récent, parfois absent |
| Multi-attach | Oui (experimental) | Oui (natif) |
| Logging | Ctrl+A H | Ctrl+B H |
| Synchronisation panes | Non | setw synchronize-panes |
# Script : surveiller plusieurs serveurs en split
#!/bin/bash
screen -dmS monitoring
screen -S monitoring -X split
screen -S monitoring -X split -v
screen -S monitoring -X focus
screen -S monitoring -X screen -t srv1 "ssh srv1 'tail -f /var/log/syslog'"
screen -S monitoring -X focus
screen -S monitoring -X screen -t srv2 "ssh srv2 'tail -f /var/log/syslog'"
screen -S monitoring -X focus
screen -S monitoring -X screen -t srv3 "ssh srv3 'tail -f /var/log/syslog'"
screen -r monitoring# Script : démarrage de services en arrière-plan avec log
#!/bin/bash
SESSION="services"
screen -dmS $SESSION
# Apache
screen -S $SESSION -X screen -t apache "tail -f /var/log/apache2/access.log"
# Nginx
screen -S $SESSION -X screen -t nginx "tail -f /var/log/nginx/access.log"
# MySQL
screen -S $SESSION -X screen -t mysql "tail -f /var/log/mysql/error.log"
echo "Session $SESSION créée."
echo "Pour voir : screen -r $SESSION"
echo "Pour détacher : Ctrl+A D"| Commande | Description |
|---|---|
screen -S nom | Démarrer une session nommée |
screen -ls | Lister les sessions actives |
screen -r | Se rattacher à une session |
screen -d -r nom | Forcer le rattacher |
Ctrl+A D | Se détacher (dans screen) |
Ctrl+A C | Nouvelle fenêtre |
Ctrl+A K | Fermer la fenêtre |
Ctrl+A " | Liste des fenêtres |
Ctrl+A S | Split horizontal |
Ctrl+A | | Split vertical |
Ctrl+A TAB | Passer au split suivant |
Ctrl+A X | Fermer le split |
Ctrl+A [ | Mode copie/scrollback |
Esc | Quitter le mode copie |
Ctrl+A H | Activer le logging |
Ctrl+A ? | Aide |
screen -S nom = créer une session nomméeCtrl+A D = se détacher sans fermer les fenêtresscreen -r = se rattacher à une sessionCtrl+A C = nouvelle fenêtre dans la sessionCtrl+A " = lister et choisir une fenêtreCtrl+A S et Ctrl+A | = diviser l'écranCtrl+A TAB = naviguer entre les splitsCtrl+A [ puis Esc = mode copie pour naviguer dans l'historiqueCtrl+A H = activer le logging d'une fenêtre~/.screenrc = fichier de configuration personnelscreen -dmS nom "cmd" = créer une session détachée qui exécute une commande