Introduction à GNU Screen pour les nuls.

Gazette Linux n°147 — Février 2008

Revelut Florent

Relecture de la version française : Deny

Article paru dans le n°147 de la Gazette Linux de février 2008.

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

Démarrer Screen
La touche préfixe
Créer et utiliser de nouvelles fenêtres
Basculer entre les fenêtres
Permanence de l'environnement : se détacher et s'attacher
Autres commandes et fonctionnalités
Un exemple de personnalisation de screenrc
Conclusion

Avec l'évolution des interfaces utilisateurs graphiques, qui sont de plus en plus intuitives et faciles à prendre en main, les nouveaux utilisateurs de GNU/Linux et des BSD peuvent maintenant effectuer leurs tâches quotidiennes sans jamais (ou rarement) avoir à utiliser un terminal. Cependant, de nombreux utilisateurs n'aiment pas utiliser une interface graphique pour tout faire et doivent donc se satisfaire d'un terminal ou un shell. De temps en temps, il est nécessaire de se connecter à une machine distante, sans interface graphique. À d'autres moments, on est dans l'obligation d'utiliser un logiciel en mode texte. Pour toutes ces situations, un utilitaire comme Screen peut être très efficace.

Sans décrire Screen en détail (ce que font parfaitement les manuels et les tutoriels), je me propose de vous montrer quelques situations que vous pouvez rencontrer et pour lesquelles Screen m'aide à être plus efficace.

  1. J'aime vraiment XTerm et je l'utilise pour tout ce qui doit se faire en ligne de commande. Cependant, la possibilité d'avoir plusieurs onglets me manque. Je sais que Konsole, GNOME terminal, mrxvt et d'autres supportent les onglets, mais ils n'offrent pas la flexibilité de démarrer des applications dans de nouveaux onglets avec une simple combinaison de touches, ce que Screen peut faire et je vous montrerai comment.

  2. J'ai mon ordinateur personnel (appelons le A) dans ma chambre et un autre dans mon laboratoire (ce sera B). Je dois pouvoir accéder au programme X qui s'exécute sur la machine B et dure très longtemps. Si je démarre le programme le matin en me connectant en ssh de A vers B, je dois pouvoir fermer la session ssh et garder mon application dans le même état, afin que, si je vais au travail et que je me connecte sur A, je sois capable de récupérer le shell qui faisait tourner X, lequel n'aura pas été arrêté entre temps. De plus, je veux aussi pouvoir accéder à la même instance du programme X en me connectant sur B par ssh depuis n'importe où. Voilà qui n'était pas facile à exprimer, mais qui est pourtant simple, non ?

Je vais donc vous montrer comment Screen vient à notre rescousse dans ce genre de situations. Ce sera plutôt des explications sur la façon dont j'arrive à mes fins et moins sur pourquoi je le fais ou sur quels autres (ou quels meilleurs) moyens existent pour le faire avec Screen. Je signalerai juste quelques astuces à la fin et vous montrerai comment en découvrir plus avec le manuel. Mon but est de vous faire découvrir Screen pour la puissance et la flexibilité qu'il offre tout en restant très simple.

Démarrer Screen

C'est maintenant le moment de lancer votre émulateur de terminal favori (ou d'aller sur un terminal virtuel) et de taper Screen. Et voilà, c'est fait !

Si vous le faites, vous ne devriez a priori rien remarquer de spécial si ce n'est qu'un autre shell est apparu. Vous pouvez cependant être sûr que Screen est en train de tourner de plusieurs façons différentes. La plus simple (mais pas forcément fiable) est de vérifier la variable d'environnement TERM.

echo $TERM

Selon toute probabilité, ce sera 'Screen' au lieu de vt100, linux ou tout autre, ce qui confirmera que vous êtes en train de faire tourner Screen. Dès que je découvre une nouvelle application, la première chose que j'aime savoir, c'est la façon de la quitter proprement afin d'avoir un moyen de pouvoir en sortir dans l'urgence, en cas de problème. Il suffit de terminer votre shell normalement (en appuyant sur exit ou Ctrl+D pour la plupart des shells) et vous devriez observer que Screen termine en même temps. Maintenant que Screen fonctionne, il est temps d'apprendre à en faire bon usage.

La touche préfixe

Pour toutes les commandes et les raccourcis de Screen, vous devrez utiliser une touche comme préfixe. Par défaut, ce préfixe est configuré sur Ctrl+A, (C-a). Ainsi, par exemple, pour créer une nouvelle fenêtre, vous taperiez C-a suivi de C-c (Ctrl+C). Cependant, pour les personnes telles que moi qui sont habituées au comportement de nombreuses applications telles que readline, emacs... C-a est un mauvais raccourci car il sert à retourner au début de la ligne. Pour contourner ce problème, il est possible d'utiliser C-a suivi de a pour obtenir l'effet désiré dans Screen  c'est cependant pénible et j'expliquerai plus tard comment configurer une autre touche comme préfixe.

Pour le reste de ce document, je supposerai cependant que C-a est le préfixe utilisé. Si vous avez déjà lu la suite et changé la touche préfixe, il suffit de substituer cette dernière à C-a : tout le reste est identique.

Créer et utiliser de nouvelles fenêtres

Une fois que vous êtes dans Screen, c'est très simple de manipuler les fenêtres et de basculer de l'une à l'autre. Tout ce que vous avez à faire pour créer une nouvelle fenêtre, c'est de taper C-a c, et vous serez automatiquement placé dedans. Bien sûr, pour le moment, toutes les fenêtres se ressemblent. Il existe cependant un moyen simple de se convaincre : dans une fenêtre, tapez un texte quelconque, par exemple ls /usb/bin, puis créez une autre fenêtre (C-a c). Ensuite, en basculant d'une fenêtre à l'autre avec C-a n, vous remarquerez que vous voyez effectivement alternativement la nouvelle fenêtre et celle dans laquelle vous avez saisi du texte.

Il est maintenant temps de créer plusieurs fenêtres et de faire des choses différentes dans chacune d'entre elles. Au bout d'une moment, vous avez perdu la trace des fenêtres que vous avez créées, non ? Comment peut-on récupérer la liste des fenêtres créées ? Facile, il suffit d'appuyer sur C-a " et de parcourir la liste des fenêtres avec les flèches, puis utiliser la touche Entrée pour basculer dans celle que vous voulez.

Bien sûr, la plupart des fenêtres semblent identiques car elles ont pour titre le nom du shell qu'elles font tourner (bash dans mon cas). Il serait donc préférable de les nommer, afin de pouvoir les reconnaître. Pour nommer une fenêtre, tout ce que vous avez à faire est de saisir C-a A (le second A est majuscule) et modifier le nom comme il vous plait. Si vous êtes perdus, C-a " vous fournira une liste de toutes les fenêtres. Ceci devrait vous aider à vous faciliter la vie pour créer et utiliser plusieurs fenêtres dans le même terminal. Mon screenrc d'exemple fourni ci-dessous propose un moyen de simuler un affichage à plusieurs onglets qui affiche le nom des fenêtres et leurs numéro, ce qui peut être utile.

Si vous voulez fermer une fenêtre, la meilleure façon est de quitter le shell (ou l'application) qui tourne dedans (bash dans mon cas). Au cas où vous seriez dans l'incapacité de fermer cette application parce qu'elle est plantée, vous pouvez aussi tuer la fenêtre et les applications qu'elle contient en utilisant C-a k. Cette façon de faire est cependant déconseillée et à n'utiliser qu'en dernier recours. Fermer toutes les fenêtres que contient un Screen va terminer ce dernier, ce qu'un message indiquera.

Ceci devrait vous donner un aperçu des possibilités de Screen. Souvent, les gens font tourner plusieurs applications, chacune dans sa propre fenêtre et ils nomment ces dernières pour pouvoir y accéder plus facilement. Par exemple, je fais souvent tourner Mutt (un client mail) et irssi (un client IRC) dans Screen et je les y laisse pour pouvoir les reprendre facilement. Maintenant que le multiplexage des fenêtres est bien compris, nous allons aborder comment attacher et détacher des morceaux et voir comment on peut accéder à une application qui tourne même après avoir fermé le terminal ou depuis une connexion distante (en se connectant via ssh sur la machine).

Basculer entre les fenêtres

Il existe plusieurs façons de naviguer parmi les différentes fenêtres d'un Screen. En voici quelques unes :

  1. Comme décrit ci-dessus, C-a " affiche un menu qui permet de choisir la fenêtre.

  2. C-a n et C-a p peuvent être utilisées pour aller respectivement à la fenêtre suivante et précédente, ce qui est pratique pour explorer de façon cyclique des fenêtres consécutives.

  3. C-a <numéro> permet d'aller directement à une fenêtre dont on connaît la position.

Une fois que vous êtes à l'aise avec la façon de se déplacer à l'intérieur d'un Screen, nous pouvons nous occuper de la fonctionnalité suivante, que j'appelle la permanence de l'environnement.

Permanence de l'environnement : se détacher et s'attacher

Bon, vous êtes en plein en train de modifier un superbe logiciel qui va complètement changer la façon dont les ordinateurs sont utilisés dans le monde entier. Ou alors, vous êtes simplement en train de jouer à un de ces jeux en ligne de commande et vous vous dites que cette fois, vous êtes enfin en mesure de pouvoir le finir. Soudain, vous réalisez qu'il est l'heure d'aller travailler et vous devez partir ! Pas de panique, il y a quelque chose que vous pouvez faire pour garder toutes vos applications qui tournent dans votre Screen telles qu'elles sont et reprendre plus tard votre travail (ou votre jeu). Vous pouvez même vous connecter à distance, avec ssh par exemple, et reprendre vos activités où elles en étaient. Plutôt sympa, non ?

La façon de faire ça avec Screen consiste à détacher et attacher Screen. Pour laisser toutes vos applications en l'état, vous avez deux solutions, chacune adaptée à une situation. La façon la plus simple, si vous faites tourner Screen dans un terminal émulé sous X (comme XTerm, gnome-terminal, Konsole...) consiste simplement en fermer cet émulateur de terminal, en utilisant le bouton Sortie, Fichier-Quitter ou n'importe quelle autre moyen. De cette façon, Screen attrape le signal envoyé par l'émulateur de terminal et se désolidarise de ce dernier, continuant de vivre même si l'émulateur termine. L'autre façon de faire, plus évidente, consiste à utiliser la combinaison de touches C-a d, qui vous rendra le shell dans lequel vous avez lancé Screen avec un message [detached]. C'est sûrement la seule façon élégante de se détacher si vous êtes dans un terminal tty. Pour se rattacher à un Screen qui tourne, tout ce que vous avez à faire est de démarrer un terminal (virtuel ou réel) et de taper

screen -r

, et ceci restaurera votre Screen dans l'état où vous l'aviez laissée. Dans le cas où vous auriez plusieurs instances de Screen, vous aurez une liste qui vous permettra de choisir celle que vous voulez attacher. Dans un tel cas, il faut juste ajouter à la commande précédente l'identifiant du processus de l'instance de Screen que vous voulez récupérer. Au cas où vous auriez oublié de détacher Screen en partant, vous pouvez le détacher à distance et le réattacher en utilisant screen -dr.

Pour vous convaincre que les applications dans les fenêtres Screen continuent à tourner même après les avoir détachées, vous pouvez effectuer le petit test suivant : démarrez un Screen puis lancez un programme, un navigateur internet en mode texte comme elinks, un gros téléchargemment avec wget ou top, par exemple. Maintenant,détachez Screen en utilisant une des méthodes précédentes et exécutez ps ax|grep <application> pour vérifier que cette dernière tourne encore. Par exemple, si j'avais lancé elinks dans Screen, c'est certain que ps ax|grep elinks me donnera des sorties contenant elinks.

De cette façon, vous avez la flexibilité de pouvoir lancer plusieurs applications, chacune dans sa propre fenêtre, et de pouvoir aisément y accéder depuis n'importe où, du moins tant que vous avez la possiblité de vous connecter sur l'ordinateur sur lequel tourne Screen.

Autres commandes et fonctionnalités

Il y a d'autres fonctionnalités de Screen dont je ne parlerai pas ici pour la simple raison que je ne les ai pas encore explorées moi-même. Notez cependant que vous pouvez lire la page de manuel pour vous faire une image raisonnable des capacités de Screen. Si vous avez besoin d'aide dans Screen, vous pouvez voir la liste des commandes et leurs combinaisons de touches associées en utilisant C-a ?.

Un exemple de personnalisation de screenrc

Avant de terminer cette introduction sur Screen, laissez moi juste vous donner un bref aperçu de comment personnaliser Screen en utilisant le fichier $HOME/.screenrc, dont les modifications seront prises en compte la prochaine fois que vous lancerez Screen. Je ne peux que conseiller de lire la page de manuel de Screen pour plus d'informations sur la syntaxe et le rôle de ces commandes.

# Avant tout, je n'aime vraiment pas utiliser C-a comme touche de
# préfixe, vu que je m'en sers souvent pour avoir le même effet que la
# touche 'home'.
# J'utilise donc C-\ comme préfixe en ajoutant la ligne suivante à 
# mon .screenrc

escape \034\034

# si vous vous posez la question, \034 correspond à la séquence de
# touches C-\ en base 8 (octal)
# Veuillez s'il vous plaît lire la documentation pour 'escape' dans la
# page de manuel pour comprendre comment je suis arrivé à ça.

# Mieux vaut un signal sonore que lumineux.
vbell off

# Inutile d'afficher le message de démarrage
startup_message off

# Affiche une étiquette en dessous, qui apparaît comme un onglet et
# informe du nom de la fenêtre et de son numéro (par défaut)
caption always
caption string "%{kw}%-w%{wr}%n %t%{-}%+w"


# Touches spéciales. 
# C-a m va lancer Mutt, par exemple, dans la fenêtre 7 (si elle n'est pas 
# utilisée) ou dans la prochaine disponible.
bind m screen -t 'Mutt'    7 mutt
bind e screen -t 'Elinks'  8 elinks www.google.ch
bind i screen -t 'Irssi'   9 irssi

C'est un screenrc vraiment très simple, conçu en copiant éhontément sur des exemples de screenrc disponibles sur les sites web ou les blogs d'autres utilisateurs. Vous pourrez trouver de bien meilleurs exemples juste en cherchant sur le web et ainsi découvrir des façons innovantes de personnaliser Screen.

Conclusion

Vous venez de lire ma tentative pour vous donner un aperçu des fonctionnalités courantes de Screen que je juge utiles pour tous les drogués de la ligne de commande qui aiment passer souvent d'une application à une autre. Une fois que vous avez commencé, vous trouverez de nombreux documents et astuces en ligne pour continuer à apprendre les fonctionnalités avancées de Screen, bien que je recommanderais déjà une lecture attentive de la page de manuel pour connaître toutes les capacités de ce fantastique logiciel. Je conseille particulièrement la section sur la surveillance des fenêtres et celle sur comment couper en deux l'écran pour afficher deux applications simultanément.

Commentaires et corrections bienvenus. Merci !

Kumar Appaiah étudie afin d'obtenir une licence technique en ingénierie électrique (B.Tech in Electrical Engineering) et un mastère en ingénierie de la communication (M.Tech in Communication Engineering) à l'institut indien de technologie de Madras (Indian Institute of Technology Madras). Il utilise GNU/Linux depuis 5 ans et est convaincu que le Logiciel Libre l'a aidé à travailler de manière pluis élégante, plus rapide et plus efficace.

C'est un adepte de Debian GNU/Linux. Il adore utiliser Mutt, GNU Emacs, XCircuit, GNU Octave, SciPy, Matplotlib et ConTeXt.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://wiki.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.