← Sommaire SkyLinux

Leçon 75 : screen — Multiplexeur de Terminal

Introduction

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.

Concepts fondamentaux

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

Démarrer et arrêter screen

# 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"

La logique detach/attach

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 travail

Commandes internes de screen

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

CombinaisonFonction
Ctrl+A DDétacher (detach) — quitter screen sans fermer les fenêtres
Ctrl+A ?Afficher l'aide et la liste des raccourcis
Ctrl+A CCréer une nouvelle fenêtre
Ctrl+A KFermer la fenêtre courante (kill)
Ctrl+A " Afficher la liste des fenêtres et basculer
Ctrl+A 0-9Aller à la fenêtre numérotée 0-9
Ctrl+A Ctrl+ARevenir à la fenêtre précédente
Ctrl+A NFenêtre suivante (next)
Ctrl+A PFenê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 SDiviser horizontalement (split horizontal)
Ctrl+A |Diviser verticalement (split vertical)
Ctrl+A TABPasser d'un split à l'autre
Ctrl+A QFermer tous les splits sauf le courant
Ctrl+A XFermer le split courant
Ctrl+A :Ouvrir la ligne de commande screen
Ctrl+A dDétacher (même que Ctrl+A D, minuscule)
Ctrl+A ZMettre en pause screen (sleep temporaire)
Ctrl+A MSurveiller l'activité de la fenêtre courante
Ctrl+A _Surveiller le silence (silence) de la fenêtre courante

Créer et organiser les fenêtres

# 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.X

Mode copie et navigation dans l'historique

Le 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 l'écran (splits)

# 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ément

Personnaliser avec .screenrc

Le 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

Configuration minimaliste recommandée

# ~/.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 on

Surveillance d'activité

Screen 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 hardstatus

Loguer une session

Screen 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 on

Envoyer des commandes à une session screen

screen -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 @echo

Définir un titre de fenêtre dynamiquement

Quand 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

Écran de veille et verrouillage

# 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

Définir des raccourcis personnalisés dans .screenrc

# ~/.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 kill

Utilisation avancée : multi-attach

Screen 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

Screen vs tmux — quelle différence ?

Fonctionscreentmux
Split d'écranOui (Ctrl+A S)Oui (Ctrl+B ")
Sessions nomméesOui (-S nom)Oui (-s nom)
Detach/attachOuiOui
Barre de statuthardstatusstatus bar
Config file~/.screenrc~/.tmux.conf
Préfixe par défautCtrl+ACtrl+B
Mode copieVi (par défaut)Vi (par défaut)
Gestionnaire de fenêtresNonLayouts automatiques
CompatibilitéPrésent sur toutes les distributionsPlus récent, parfois absent
Multi-attachOui (experimental)Oui (natif)
LoggingCtrl+A HCtrl+B H
Synchronisation panesNonsetw synchronize-panes

Scripts pratiques avec screen

# 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"

Récapitulatif des commandes principales

CommandeDescription
screen -S nomDémarrer une session nommée
screen -lsLister les sessions actives
screen -rSe rattacher à une session
screen -d -r nomForcer le rattacher
Ctrl+A DSe détacher (dans screen)
Ctrl+A CNouvelle fenêtre
Ctrl+A KFermer la fenêtre
Ctrl+A "Liste des fenêtres
Ctrl+A SSplit horizontal
Ctrl+A |Split vertical
Ctrl+A TABPasser au split suivant
Ctrl+A XFermer le split
Ctrl+A [Mode copie/scrollback
EscQuitter le mode copie
Ctrl+A HActiver le logging
Ctrl+A ?Aide

Résumé