Utiliser GNU Screen pour attacher et détacher des sessions de console
GNU Screen est un multiplexeur de terminal qui vous permet de créer, gérer et reprendre de manière persistante plusieurs sessions shell indépendantes depuis une seule connexion terminal. Lorsque vous détachez une session Screen, chaque processus s’exécutant à l’intérieur continue de s’exécuter en arrière-plan — survivant aux déconnexions SSH, aux coupures réseau et aux fermetures de terminal — jusqu’à ce que vous rattachiez ou terminiez explicitement la session.
Cette capacité est indispensable pour les administrateurs système gérant des serveurs distants via SSH. Que vous compiliez une grande base de code, exécutiez une migration de base de données, surveilliez des journaux ou effectuiez une tâche de sauvegarde de plusieurs heures, Screen garantit que le travail continue indépendamment de ce qui arrive à votre connexion client.
Pourquoi GNU Screen reste pertinent dans l’infrastructure moderne
Des outils comme `tmux` ont gagné en popularité, mais GNU Screen reste omniprésent dans les environnements Linux d’entreprise, les systèmes embarqués et l’infrastructure héritée. Il est livré comme package par défaut ou quasi-défaut sur la plupart des distributions serveur, ne nécessite aucune configuration pour être immédiatement utile, et son modèle de persistance de session est extrêmement fiable. Sur un VPS ou un serveur dédié où la disponibilité et l’exécution ininterrompue des tâches sont critiques, Screen est souvent le chemin le plus rapide vers une session persistante fiable.
Principaux avantages opérationnels :
- Persistance de session lors des déconnexions — les processus survivent aux délais d’expiration SSH et aux interruptions réseau
- Multiplexage multi-fenêtres — exécutez des tâches parallèles au sein d’une seule connexion SSH
- Faible consommation de ressources — empreinte CPU et mémoire négligeable par rapport aux alternatives basées sur une interface graphique
- Gestion de session scriptable — automatisez la création de sessions et l’injection de commandes via des scripts shell
- Large compatibilité — disponible sur pratiquement tous les systèmes conformes POSIX
GNU Screen vs. tmux : choisir le bon multiplexeur
Les deux outils résolvent le même problème fondamental mais diffèrent de manière significative en termes d’architecture, de profondeur de configuration et d’ergonomie de scripting.
| Fonctionnalité | GNU Screen | tmux |
|---|
| — | — | — |
|---|
| Disponibilité par défaut | Préinstallé sur la plupart des distributions | Nécessite une installation explicite |
|---|
| Fichier de configuration | `.screenrc` | `.tmux.conf` |
|---|
| Division de panneaux | Verticale et horizontale (limitée) | Division complète avec mises en page |
|---|
| Scripting / automatisation | Injection de commandes `screen -X` | `tmux send-keys`, API riche |
|---|
| Personnalisation de la barre d’état | Basique | Hautement personnalisable |
|---|
| Mode copie | Style Vi, moins intuitif | Modes Vi et Emacs, intégration presse-papiers |
|---|
| Partage de session | Pris en charge via l’option `-x` | Pris en charge nativement |
|---|
| Courbe d’apprentissage | Faible | Modérée |
|---|
| Cas d’utilisation idéal | Sessions persistantes rapides, systèmes hérités | Flux de travail complexes multi-panneaux |
|---|
Pour une persistance de session simple sur un serveur distant — le cas d’utilisation le plus courant pour un administrateur système — la simplicité de Screen est une fonctionnalité, pas une limitation.
Installation de GNU Screen
Avant de continuer, vérifiez si Screen est déjà présent :
“`bash
screen –version
“`
S’il n’est pas installé, utilisez le gestionnaire de packages approprié pour votre distribution.
Debian / Ubuntu :
“`bash
sudo apt-get update && sudo apt-get install screen
“`
CentOS / RHEL 7 et antérieurs :
“`bash
sudo yum install screen
“`
CentOS Stream / RHEL 8+ / Fedora :
“`bash
sudo dnf install screen
“`
Arch Linux :
“`bash
sudo pacman -S screen
“`
macOS (via Homebrew) :
“`bash
brew install screen
“`
Vérification :
“`bash
screen –version
Output example: Screen version 4.09.00 (GNU) 30-Jan-22
“`
Démarrer une session Screen
Démarrage de session basique
“`bash
screen
“`
Cela vous place dans une nouvelle session Screen avec une invite shell standard. La session se voit automatiquement attribuer un identifiant numérique basé sur le PID.
Sessions nommées (fortement recommandé)
Nommez toujours vos sessions dans les environnements de production. Les sessions nommées sont beaucoup plus faciles à identifier et à rattacher lorsque vous avez plusieurs tâches simultanées en cours d’exécution :
“`bash
screen -S session_name
“`
Exemples pratiques :
“`bash
screen -S db_migration
screen -S log_monitor
screen -S build_job
“`
Le nommage est particulièrement utile lors de la gestion de plusieurs charges de travail sur un serveur dédié où plusieurs administrateurs peuvent travailler simultanément.
Démarrer une session avec une commande
Vous pouvez lancer Screen et exécuter immédiatement une commande à l’intérieur :
“`bash
screen -S backup_job bash -c 'rsync -avz /data/ /backup/ && echo "Done"'
“`
La session persiste même après la fin de la commande, vous permettant de vous rattacher et d’inspecter la sortie.
Se détacher d’une session Screen
Le détachement est le flux de travail principal qui rend Screen précieux. Il suspend votre vue de la session tout en laissant tout ce qui s’y trouve continuer à s’exécuter.
Raccourci clavier :
“`
Ctrl + A, then D
“`
- `Ctrl + A` — le préfixe de commande Screen (toutes les commandes Screen commencent par celui-ci)
- `D` — détacher
Après le détachement, votre terminal revient à l’invite shell d’origine. La session Screen et tous les processus qu’elle contient continuent de s’exécuter en arrière-plan. Vous verrez un message de confirmation :
“`
[detached from 12345.db_migration]
“`
Piège critique : Ne confondez pas le détachement (`Ctrl+A, D`) avec la fermeture d’une fenêtre (`Ctrl+A, K` tue la fenêtre actuelle). Fermer toutes les fenêtres termine entièrement la session.
Lister les sessions Screen actives
“`bash
screen -ls
“`
Exemple de sortie :
“`
There are screens on:
18423.db_migration (Detached)
18891.log_monitor (Attached)
19204.build_job (Detached)
3 Sockets in /var/run/screen/S-root.
“`
Les indicateurs d’état sont significatifs :
- Detached — aucun terminal n’est actuellement connecté ; la session s’exécute en arrière-plan
- Attached — un terminal est activement connecté à cette session
- Dead — le processus de session s’est terminé mais le fichier socket n’a pas été nettoyé (utilisez `screen -wipe` pour supprimer les sessions mortes)
Se rattacher à une session Screen
Rattachement par nom de session
“`bash
screen -r db_migration
“`
Rattachement par PID de session
“`bash
screen -r 18423
“`
Rattachement lorsqu’une seule session existe
“`bash
screen -r
“`
Screen se rattachera automatiquement s’il n’y a qu’une seule session détachée présente.
Forcer le rattachement d’une session déjà attachée
C’est le scénario qui prend de nombreux administrateurs par surprise. Si votre connexion SSH s’est interrompue de manière incorrecte, la session peut toujours apparaître comme Attached car le terminal précédent ne s’est pas détaché proprement. Tenter un `screen -r` standard échouera avec :
“`
There is a screen on: 18891.log_monitor (Attached)
There is no screen to be resumed.
“`
La solution est de forcer le détachement de l’ancien terminal et de se rattacher immédiatement :
“`bash
screen -d -r log_monitor
“`
- `-d` — détache à distance la session du terminal qui la détient actuellement
- `-r` — rattache au terminal actuel
Alternative avec identifiant de session explicite :
“`bash
screen -d -r 18891
“`
C’est l’une des commandes Screen les plus importantes sur le plan opérationnel et elle est fréquemment nécessaire après des déconnexions inattendues d’un VPS.
Gestion multi-fenêtres à l’intérieur d’une session
L’une des fonctionnalités les plus puissantes de Screen est la capacité d’exécuter plusieurs fenêtres indépendantes (terminaux virtuels) au sein d’une seule session. Chaque fenêtre maintient son propre shell, arborescence de processus et tampon de défilement.
Créer une nouvelle fenêtre
“`
Ctrl + A, then C
“`
Naviguer entre les fenêtres
| Action | Raccourci |
|---|
| — | — |
|---|
| Fenêtre suivante | `Ctrl + A, N` |
|---|
| Fenêtre précédente | `Ctrl + A, P` |
|---|
| Aller à la fenêtre par numéro | `Ctrl + A, [0-9]` |
|---|
| Liste interactive des fenêtres | `Ctrl + A, "` |
|---|
| Dernière fenêtre active | `Ctrl + A, Ctrl + A` |
|---|
Nommer une fenêtre
“`
Ctrl + A, then A
“`
Vous serez invité à saisir un nom pour la fenêtre actuelle. Les fenêtres nommées apparaissent dans la liste des fenêtres et dans la barre d’état, rendant la navigation beaucoup plus facile lorsque vous exécutez cinq tâches parallèles ou plus.
Fermer une fenêtre
Tapez `exit` dans le shell, ou appuyez sur `Ctrl + D`. Lorsque la dernière fenêtre d’une session est fermée, la session Screen elle-même se termine.
Pour forcer la fermeture de la fenêtre actuelle sans quitter le shell :
“`
Ctrl + A, then K
“`
Diviser l’écran (régions)
GNU Screen prend en charge la division basique du terminal, moins flexible que tmux mais fonctionnelle pour la surveillance côte à côte.
Division horizontale (haut/bas) :
“`
Ctrl + A, then S
“`
Division verticale (gauche/droite) :
“`
Ctrl + A, then |
“`
Déplacer le focus vers la région suivante :
“`
Ctrl + A, then Tab
“`
Supprimer la région actuelle (sans fermer la fenêtre) :
“`
Ctrl + A, then X
“`
Supprimer toutes les régions sauf la région actuelle :
“`
Ctrl + A, then Q
“`
Après la division, chaque région est initialement vide. Naviguez vers une région avec `Tab` puis ouvrez-y une fenêtre en utilisant `Ctrl + A, N` ou `Ctrl + A, "`.
Partager une session Screen entre plusieurs utilisateurs
Screen prend en charge le partage de session multi-utilisateurs, ce qui est utile pour le débogage collaboratif ou l’administration en binôme. Cela nécessite que Screen soit installé avec les permissions setuid.
Activer le mode multi-utilisateur dans une session :
“`
Ctrl + A, then :multiuser on
“`
Accorder l’accès à un autre utilisateur :
“`
Ctrl + A, then :acladd username
“`
L’autre utilisateur peut ensuite se rattacher à votre session :
“`bash
screen -x your_username/session_name
“`
Note de sécurité : Les sessions Screen multi-utilisateurs nécessitent un contrôle d’accès rigoureux. N’accordez les permissions `acladd` qu’à des comptes de confiance. Dans les environnements d’hébergement partagé, cette fonctionnalité est généralement restreinte.
Envoyer des commandes à une session détachée
L’une des capacités sous-estimées de Screen est la possibilité d’injecter des commandes dans une session en cours d’exécution sans se rattacher :
“`bash
screen -S db_migration -X stuff "tail -f /var/log/app.logn"
“`
La commande `-X stuff` envoie des frappes clavier à la session comme si elles étaient tapées. `n` simule l’appui sur Entrée. Cela est extrêmement utile pour les scripts d’automatisation qui doivent interagir avec une session Screen en cours d’exécution.
Configurer Screen avec .screenrc
Le fichier `.screenrc` dans votre répertoire personnel contrôle le comportement par défaut de Screen. Une configuration minimale mais pratique :
“`bash
~/.screenrc
Disable the startup message
startup_message off
Set scrollback buffer to 10,000 lines
defscrollback 10000
Enable UTF-8
defutf8 on
Show a status bar at the bottom
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
Set default shell
shell -$SHELL
“`
Le paramètre `defscrollback 10000` est particulièrement important — le tampon de défilement par défaut n’est que de 100 lignes, ce qui est insuffisant pour surveiller des processus de longue durée.
Référence complète des commandes Screen
| Commande / Raccourci | Fonction |
|---|
| — | — |
|---|
| `screen` | Démarrer une nouvelle session sans nom |
|---|
| `screen -S name` | Démarrer une session nommée |
|---|
| `screen -ls` | Lister toutes les sessions |
|---|
| `screen -r name` | Se rattacher à une session détachée |
|---|
| `screen -d -r name` | Forcer le détachement et se rattacher |
|---|
| `screen -x name` | Se rattacher à une session déjà attachée (vue partagée) |
|---|
| `screen -wipe` | Supprimer les sockets de sessions mortes |
|---|
| `Ctrl + A, D` | Se détacher de la session actuelle |
|---|
| `Ctrl + A, C` | Créer une nouvelle fenêtre |
|---|
| `Ctrl + A, N` | Fenêtre suivante |
|---|
| `Ctrl + A, P` | Fenêtre précédente |
|---|
| `Ctrl + A, "` | Liste interactive des fenêtres |
|---|
| `Ctrl + A, A` | Renommer la fenêtre actuelle |
|---|
| `Ctrl + A, K` | Fermer la fenêtre actuelle |
|---|
| `Ctrl + A, S` | Division horizontale |
|---|
| `Ctrl + A, | ` | Division verticale |
|---|
| `Ctrl + A, Tab` | Passer à la région suivante |
|---|
| `Ctrl + A, Q` | Supprimer toutes les régions sauf la région actuelle |
|---|
| `Ctrl + A, [` | Entrer en mode copie/défilement |
|---|
| `Ctrl + A, ?` | Afficher toutes les liaisons de touches |
|---|
| `Ctrl + A, :quit` | Terminer la session entière |
|---|
Journalisation de la sortie d’une session Screen
Screen peut enregistrer tout ce qui est affiché dans une fenêtre dans un fichier — précieux pour l’audit des tâches de longue durée :
Activer/désactiver la journalisation pour la fenêtre actuelle :
“`
Ctrl + A, then H
“`
Cela crée un fichier nommé `screenlog.N` (où N est le numéro de fenêtre) dans le répertoire actuel. Vous pouvez également activer la journalisation depuis la ligne de commande lors du démarrage d’une session :
“`bash
screen -L -S monitored_job
“`
Ou spécifier un fichier journal personnalisé dans `.screenrc` :
“`bash
logfile /var/log/screen/session_%t_%Y%m%d.log
“`
Cas d’utilisation pratiques sur les serveurs distants
Migrations de bases de données de longue durée : Démarrez une migration dans une session Screen nommée, détachez-vous et surveillez la progression en vous rattachant périodiquement. Si la connexion SSH s’interrompt, la migration continue sans interruption.
Surveillance continue des journaux : Exécutez `tail -f` ou `multitail` dans une fenêtre Screen. Détachez-vous et rattachez-vous chaque fois que vous avez besoin de vérifier l’état actuel.
Tâches de compilation : Les grandes compilations C++ ou de noyau peuvent prendre des heures. Screen garantit que la compilation se termine même si votre ordinateur portable perd sa connectivité.
Processus interactifs qui ne peuvent pas être mis en arrière-plan : Certains outils — CLI de bases de données, sessions Python interactives, installateurs en mode texte — ne peuvent pas simplement être envoyés en arrière-plan avec `&`. Screen les encapsule proprement dans une session persistante.
Coordination multi-administrateurs : En utilisant `screen -x`, deux administrateurs peuvent observer la même session simultanément, ce qui est utile lors de la réponse à un incident sur un serveur dédié.
Si vous gérez une infrastructure web en parallèle avec des sessions persistantes, associer Screen à un VPS avec cPanel bien configuré vous offre à la fois une interface de gestion graphique et une capacité complète de multiplexage terminal. Pour les équipes gérant les renouvellements SSL et les déploiements de certificats via la ligne de commande, les Certificats SSL combinés aux scripts d’automatisation basés sur Screen peuvent rendre le processus entièrement autonome.
Pièges courants et comment les éviter
Accumulation de sessions orphelines : Les administrateurs oublient fréquemment de terminer les sessions après la fin des tâches. Exécutez `screen -ls` régulièrement et utilisez `screen -wipe` pour nettoyer les sockets morts. Terminez les sessions inactives avec `screen -S session_name -X quit`.
Tampon de défilement trop petit : Le tampon par défaut de 100 lignes signifie que vous perdez rapidement l’historique de sortie. Définissez toujours `defscrollback 10000` ou plus dans `.screenrc`.
Sessions Screen imbriquées : Si vous vous connectez en SSH depuis l’intérieur d’une session Screen et démarrez une autre session Screen sur l’hôte distant, les commandes `Ctrl + A` seront capturées par la session externe. Utilisez `Ctrl + A, A` pour envoyer un `Ctrl + A` littéral à la session interne, ou utilisez `Ctrl + A, :sessionname` pour les différencier.
Session laissée en état Attached après déconnexion : Une connexion SSH interrompue peut laisser une session en état Attached. Utilisez toujours `screen -d -r` plutôt que le simple `screen -r` lors de la reconnexion après une déconnexion inattendue.
Problèmes de locale et d’encodage : Si vous voyez des caractères illisibles, assurez-vous que votre terminal et Screen utilisent tous deux UTF-8. Ajoutez `defutf8 on` à `.screenrc` et vérifiez que votre variable d’environnement `LANG` est définie sur une locale UTF-8 (par exemple, `en_US.UTF-8`).
Matrice de décision : quand utiliser Screen
| Scénario | Utiliser Screen ? | Notes |
|---|
| — | — | — |
|---|
| Processus distant de longue durée | Oui | Cas d’utilisation principal |
|---|
| Commande SSH ponctuelle rapide | Non | Surcharge non justifiée |
|---|
| Flux de travail terminal multi-panneaux | Peut-être | Envisagez tmux pour les mises en page complexes |
|---|
| Session de débogage partagée | Oui | Utilisez `-x` pour la vue partagée |
|---|
| Script automatisé sans interaction | Non | Utilisez `nohup` ou le service `systemd` |
|---|
| Processus interactif qui ne peut pas être démonisé | Oui | Screen est idéal |
|---|
| Tableau de bord de surveillance persistant | Oui | Associez avec des fenêtres nommées et la journalisation |
|---|
Liste de contrôle des points clés techniques
- Nommez toujours les sessions avec `screen -S descriptive_name` — les sessions sans nom deviennent ingérables à grande échelle
- Définissez `defscrollback 10000` dans `.screenrc` avant d’en avoir besoin, pas après avoir perdu la sortie
- Utilisez `screen -d -r` comme commande de rattachement par défaut pour gérer les états Attached et Detached sans y penser
- Activez la journalisation de session avec `screen -L` pour toute tâche dont vous pourriez avoir besoin d’auditer la sortie ultérieurement
- Exécutez `screen -wipe` périodiquement pour supprimer les sockets de sessions mortes et garder la sortie de `screen -ls` lisible
- Injectez des commandes dans les sessions détachées avec `screen -X stuff` pour automatiser l’interaction sans se rattacher
- Pour les environnements multi-administrateurs, configurez `.screenrc` avec `multiuser on` et des ACL explicites plutôt que de vous fier à un accès root partagé
- Testez votre configuration `.screenrc` sur un système hors production avant de la déployer sur une infrastructure critique
Foire aux questions
Que se passe-t-il avec une session Screen si le serveur redémarre ?
Toutes les sessions Screen sont perdues lors d’un redémarrage. Les sessions Screen sont des processus s’exécutant en mémoire — elles ne survivent pas à un redémarrage du système. Pour des services véritablement persistants, utilisez des fichiers d’unité `systemd` ou des scripts init. Screen est destiné à la persistance de session interactive lors des déconnexions, pas lors des redémarrages.
Puis-je utiliser Screen sur un compte d’hébergement partagé ?
Les environnements d’hébergement web partagé standard restreignent généralement l’accès SSH et peuvent ne pas avoir Screen installé ou accessible. Screen est plus efficace sur les environnements VPS ou serveur dédié où vous disposez d’un accès shell complet et de privilèges root ou sudo.
Quelle est la différence entre `screen -r` et `screen -x` ?
`screen -r` se rattache à une session détachée, vous donnant un accès exclusif. `screen -x` se rattache à une session déjà attachée, créant une vue partagée où plusieurs terminaux voient la même session simultanément — utile pour le dépannage collaboratif.
Comment faire défiler vers le haut dans une session Screen pour voir la sortie précédente ?
Entrez en mode copie/défilement avec `Ctrl + A, [`. Utilisez les touches fléchées ou Page Précédente/Page Suivante pour naviguer. Appuyez sur `Escape` ou `Q` pour quitter le mode copie. Assurez-vous que votre tampon de défilement est suffisamment grand en définissant `defscrollback` dans `.screenrc`.
GNU Screen est-il encore activement maintenu ?
Oui. GNU Screen est activement maintenu sous le projet GNU. La version 4.9.x a été publiée en 2022. Bien qu’il ne reçoive pas le développement rapide de fonctionnalités que tmux reçoit, il reçoit des correctifs de sécurité et des corrections de bogues, ce qui le rend fiable pour une utilisation en production sur une infrastructure serveur à long terme.
