15%

Économisez 15% sur tous les services d'hébergement

Testez vos compétences et obtenez Réduction sur tout plan d'hébergement

Utilisez le code :

Skills
Commencer
09.10.2024

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 Screentmux
Disponibilité par défautPréinstallé sur la plupart des distributionsNécessite une installation explicite
Fichier de configuration`.screenrc``.tmux.conf`
Division de panneauxVerticale et horizontale (limitée)Division complète avec mises en page
Scripting / automatisationInjection de commandes `screen -X``tmux send-keys`, API riche
Personnalisation de la barre d’étatBasiqueHautement personnalisable
Mode copieStyle Vi, moins intuitifModes Vi et Emacs, intégration presse-papiers
Partage de sessionPris en charge via l’option `-x`Pris en charge nativement
Courbe d’apprentissageFaibleModérée
Cas d’utilisation idéalSessions persistantes rapides, systèmes héritésFlux 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

“`

ActionRaccourci
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 / RaccourciFonction
`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énarioUtiliser Screen ?Notes
Processus distant de longue duréeOuiCas d’utilisation principal
Commande SSH ponctuelle rapideNonSurcharge non justifiée
Flux de travail terminal multi-panneauxPeut-êtreEnvisagez tmux pour les mises en page complexes
Session de débogage partagéeOuiUtilisez `-x` pour la vue partagée
Script automatisé sans interactionNonUtilisez `nohup` ou le service `systemd`
Processus interactif qui ne peut pas être démoniséOuiScreen est idéal
Tableau de bord de surveillance persistantOuiAssociez 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.

15%

Économisez 15% sur tous les services d'hébergement

Testez vos compétences et obtenez Réduction sur tout plan d'hébergement

Utilisez le code :

Skills
Commencer