Screen

Un article de RotomaLUG.

Frontal web Wiki accueil Les forums La galerie La liste LUG La liste INSTALL PARTY




But : Je souhaite proposer une petite traduction du document suivant :

http://www.bangmoney.org/presentations/screen.html

ainsi qu'un petit atelier.

Traducteur : --EricDeschamps 18 septembre 2006 à 14:48 (CEST)

Avancement :

  • traduction 100%
  • relecture : 100%


Suit la traduction du document


Image:Ok48.png Cet article est considéré par son ou ses auteurs comme achevé. Informez le/les de toute modification importante que vous y apporteriez.



Sommaire

Screen - le multiplexeur de terminal

par Chris Lumens

24 Mars 2004

Traduit par Eric Deschamps pour RotomaLUG

Qu'est-ce que screen ?

Screen est un multiplexeur de terminal : il gère l'affichage des processus à l'intérieur d'un terminal. C'est un peu comme un gestionnaire de fenêtres pour votre console ou un émulateur de terminal. Avec screen, vous pouvez lancer des programmes interactifs sur votre pc personnel et vous connecter d'un autre poste pour voir où ils en sont. Quels types de programmes sont intéressants à lancer dans screen ?

  • les téléchargements de films ;
  • un client de messagerie en ligne de commandes ;
  • le suivi de journaux (logs) ;
  • les gros travaux de compilation (noyau, make World, etc.)

Terminologie

Screen travaille sur 3 niveaux différents. Vous devez vous familiariser avec le sens des termes suivants pour suivre le reste de cette présentation :

  • session : une session est créée lorsque vous lancez une nouvelle instance de screen à la ligne de commande. Plusieurs programmes peuvent fonctionner simultanément dans une même session. Une session peut contenir plusieurs fenêtres.
  • fenêtre : les fenêtres sont créées à l'intérieur d'une session et gèrent les programmes. Par défaut, une seule fenêtre est créée lorsque vous lancez screen pour afficher le programme en cours (par exemple un shell). Vous pouvez créer plusieurs fenêtres dans une seule session et passer de l'une à l'autre rapidement.
  • région : une région est une partie de la fenêtre en cours. Lorsque que vous fractionnez, vous créez deux régions à l'intérieur de la même fenêtre. Chaque région peut alors afficher un programme différent.

En outre, cela peut vous aider de connaître le sens de :

  • détacher : Détache le programme en cours du terminal. Pour le point de vue de l'utilisateur, le programme disparaît et l'utilisateur retourne au shell en dehors de screen. Cependant, tous les programmes gérés par screen continuent de fonctionner.
  • attacher : s'attacher à un programme initialement détaché. Le programme qui fonctionnait dans la session détachée est de nouveau attaché au terminal utilisateur, comme si vous l'aviez conservé à l'écran.

Les bases

Commander screen

Screen essaie au maximum de ne pas vous déranger. Presque tout ce que vous tapez est envoyé au programme en cours. Cela rend l'interaction avec screen quelque peu bizarre. Toutes les commandes screen commencent par Ctrl+a, que l'on abrège par ^A (NdT : l'utilisation de Ctrl+A pose d'ailleurs un petit conflit avec certains shells comme le bash où Ctrl+A correspond au début de ligne). Tout ce que vous êtes sensé taper vous est affiché sur l'aide (^A ?). Une fois tapé le ^A, vous devez utiliser une touche qui indique à screen ce qu'il doit faire. ^A ? vous donne la liste de toutes les commandes possibles, alors que ^A : vous renvoie un prompt que vous pouvez utiliser pour taper des commandes ou pour paramétrer des variables. Toutes les touches de commandes ont un équivalent en mot que vous pouvez utiliser.

Créer de nouvelles sessions

Vous créez une nouvelle session en ligne de commande. Sans option, screen créé une nouvelle session et lance votre $SHELL à l'intérieur :

$screen

Cette session sera nommée à partir du PID (identifiant de processus), TTY (identifiant du terminal ou terminal virtuel) et le nom de la machine sur laquelle screen est lancé. Pas tellement descriptif ou exitant. Heureusement, vous pouvez facilement donner un nom à une session :

$ screen -S edonkey

Si vous lancez une session et oubliez de lui donner un nom, ne vous inquiétez pas. Vous pouvez utiliser ^A : sessionname <nom> pour lui donner un nom. Notez que les noms de sessions n'ont rien à voir avec les noms des fenêtres, comme nous le verrons plus tard. Enfin, vous pouvez, en lançant screen , lancer un programme différent de votre shell avec cette option :

$ screen -e pine

Détacher

Alors que vous êtes assis tranquillement, en train de recompiler votre distribution, vous vous rendez compte qu'il est temps d'aller en cours (NdT : ou au boulot, pour les vrais gens). Vous aimeriez pouvoir suivre l'avancement de la compilation plus tard. Heureusement, vous avez lancé la compilation dans une session screen. Pour pouvoir vous y attacher plus tard, vous devez d'abord vous détacher ici avec ^A d. La session de compilation va disparaître et vous retournerez au prompt à partir duquel vous aviez lancé screen.

Attacher

L'opération inverse consiste à s'attacher, c'est à dire se reconnecter à une session précédemment détachée. Si vous aviez uniquement une session en cours, c'est particulièrement facile de vous y attacher :

$ screen -r

Cependant, il est possible que vous ayez plusieurs sessions fonctionnant. Dans ce cas, vous devez indiquer à screen à quelle session vous souhaitez vous attacher. Bien sûr, vous souhaitez savoir quelles possibilités vous avez. Par chance, screen fournit une option qui liste les sessions en cours :

$ screen -ls
  There are screens on:
       15150.uml-slk   (Detached)
       18614.uml-fed   (Detached)
  2 Sockets in /tmp/screens/S-root.

Vous spécifiez le nom ou le PID de la session après l'option -r et la session s'attache à votre terminal. Vous comprenez pourquoi vous pourriez avoir envie de nommer les sessions, tout particulièrement si vous en lancez beaucoup.

Travailler dans une session

Lancer plusieurs sessions est facile mais passer de l'une à l'autre peut être pénible, puisque vous devez attacher et détacher tout le temps. Une meilleure solution est de lancer une seule session avec plusieurs fenêtres à l'intérieur. Comme vous le verrez, passer d'une fenêtre à l'autre est particulièrement rapide et performant.

Nouvelles fenêtres

Créer une nouvelle fenêtre est facile : tapez ^A c. Screen lance une nouvelle fenêtre et lance votre shell à l'intérieur. Votre précédente fenêtre active est masquée mais tous les programmes lancés dans cette fenêtre continuent de tourner. Si vous détachez une session contenant plusieurs fenêtres, tous les programmes lancés dans toutes les fenêtres vont continuer de fonctionner. Lorsque que vous rattachez screen à votre terminal, la fenêtre active sera de nouveau affichée.

Gestion des fenêtres

La chose la plus difficile si vous utilisez plusieurs fenêtres, c'est d'en conserver la trace. L'affichage par défaut ne vous donne aucune information sur les fenêtres ouvertes et les programmes lancés à l'intérieur de celles-ci. Lorsque que vous basculez de l'une à l'autre, la précédente disparaît. Heureusement, screen fournit plusieurs possibilités pour garder une trace de toutes vos fenêtres.

Les fenêtres peuvent être nommées, tout comme les sessions. Par défaut, le nom d'une fenêtre est le nom du programme qu'elle fait tourner, en général votre shell. Renommer les fenêtres va vous aider à les gérer, on le fait par ^A A. screen affiche un prompt en bas pour fournir le nom.

Une façon simple de lister vos fenêtres est la combinaison ^A w, qui vous donne tous les noms et numéros de fenêtres en bas de l'écran. Cette ligne affiche également quelques informations sur le statut, la plus importante c'est que la fenêtre active est marquée par un astérisque. C'est seulement une liste, par contre, pas moyen de basculer d'une fenêtre à une autre. Si vous souhaitez sélectionner dans une liste, vous pouvez utiliser ^A ", flèche basse vers la fenêtre que vous souhaitez, et entrée. Ou, si vous connaissez le numéro de la fenêtre, ^A 0-9 la placera au dessus. Comme nous le verrons tout à l'heure, il est possible d'afficher une liste des fenêtres en continu. Ceci, combiné au basculement en utilisant un numéro, est la manière la plus rapide de se déplacer parmi les fenêtres.

Gestion des régions

Finalement, vous avez les régions. Screen peut séparer l'affichage en plusieurs zones comme le fait vim. Vous pouvez diviser la fenêtre en deux régions de même taille avec ^A S. Le programme que vous utilisiez va se tasser dans une région de la moitié de la taille d'origine, et une autre région sera ouverte dans l'autre moitié. La nouvelle région sera vide et ne contiendra pas d'application tant que vous n'aurez pas collé une de vos fenêtres à l'intérieur.

Il y a plusieurs façons de se placer (et déplacer) dans les régions, même le plus simple est ^A <tab>. Une fois que vous êtes dans une région, vous pouvez y afficher n'importe laquelle de vos fenêtres en basculant vers elle avec ^A 0-9, ou vous pouvez créer un nouveau shell dans cette région avec ^A c.

Enfin, vous pourriez en avoir marre de toutes ces régions qui encombrent vos fenêtres et avoir envie de les tuer. Vous pouvez n'afficher que la région courante avec ^A Q, qui masque toutes les autres régions qui deviennent de nouveau accessibles en passant par les numéros de fenêtres. Vous pouvez aussi tuer la région courante avec ^A X. Notez que masquer une région ne tue pas les programmes fonctionnant dans cette région, contrairement à tuer une région.

Quitter screen

Screen se ferme lorsque tous ses processus fils (ceux qui ont été lancés sous screen) sont fermés. Cela veut dire que vous devrez fermer tous les shells (avec ^D ou exit) dans chacune des fenêtres screen. En général c'est ce que vous voulez. Mais parfois, vous pourriez vouloir quitter screen immédiatement. ^A ^\ tuera screen et tous les programmes fils, c'est à dire tous les shells, dans toutes les fenêtres et tous les processus lancés dans ces shells. A utiliser avec parcimonie !

Utilisation avancée

Attacher

Vous pourriez être, pas exemple, chez vous et souhaiter vous attacher à une session que vous avez oublié de détacher auparavant à votre travail. Vous avez de la chance puisque screen vous offre deux possibilités pour résoudre ce genre de problème. La première :

$ screen  -x src

qui attache à la session src sans la détacher. En d'autres termes, vous avez deux sessions qui observent exactement les mêmes programmes, shells, etc. Tout ce que vous faites dans une session est affiché dans l'autre. Lorsque vous avez fini, détachez-vous de la session (avec ^D), l'autre session reste attachée. Cependant, c'est plus pratique si vous avez le même type de terminal ainsi que la même taille.

Vous pouvez également utiliser une des 6 combinaisons d'options -D -R décrites dans la page de manuel de screen pour détacher les sessions actives avant de vous y rattacher.

Digrammes

NdT : la traduction littérale choisie de digraph vers digramme n'est sans doute pas très exacte, voir la définition donnée ici : http://dictionnaire.tv5.org/dictionnaires.asp?Action=1&Mot=digramme&Alea=4162

Les digrammes sont des caractères qui nous demandent des combinaisons de touches parce que notre clavier ne gère pas ce symboles. Par exemple, un clavier QWERTY anglais ou américain ne gère pas les caractères suivants : ë, ø, et Æ. X vous permet de les gérer avec la touche compose, que vous pouvez lier à n'importe quelle touche morte. screen vous permet de faire la même chose avec la commande digramme. Tapez ^A^V suivi du digramme. Les 3 caractères que j'ai faits en dessous (NdT : sur un clavier anglais) sont composés de :

  • ë = ^A ^V e :
  • ø = ^A ^V o /
  • Æ = ^A ^V A E

La liste des digrammes de screen fait partie de screen (c'est en dur dans le code de screen), donc vous ne pouvez pas ajouter les vôtres. Notez que ^V est aussi la commande d'insertion de vim qui vous permet d'insérer des séquences de contrôle dans vos fichiers.

Contrôle d'activité

Disons que vous avez pas mal de fenêtres ouvertes. L'une d'entre elles est inoccupée sur un canal irc très calme. Comme il ne s'y passe pas grand chose vous ne voulez pas garder cette fenêtre active mais vous souhaitez être au courant si ça remue un peu. screen vous permet de contrôler l'activité d'une fenêtre en vous plaçant dessus puis en tapant ^A M. Quand il se passe quelquechose dans cette fenêtre screen vous en informe en bas de l'écran.

A l'inverse, disons que vous compilez X dans une autre fenêtre. Cela génère énormément de messages et vous souhaitez être prévenu lorsque la compilation est finie. Screen vous informera après 30 secondes d'inactivité si vous vous placez dans la fenêtre puis tapez ^A _. Screen vous avertira par un message en bas de l'écran.

Pour désactiver ces commandes il suffit de vous remettre dans la fenêtre et de retaper la commande.

Sessions screen enchevêtrées

Oui, il est possible d'avoir des sessions screen à l'intérieur d'autre sessions. Ca peut devenir très vite confus, donc je me contente de vous en faire part pour que vous sachiez que c'est possible. L'un des problèmes bien sûr, c'est d'envoyer le ^A à l'une des sessions, puisque la session la plus à l'extérieur va l'interpréter et non pas l'envoyer à l'une de ses sessions filles. Dans ce cas vous devez taper ^A a qui transmet ^A au programme en cours, qui peut être un autre screen. Si vous avez un screen lancé dans un autre et que vous souhaitez avoir la liste des fenêtres du screen qui se trouve à l'intérieur, tapez ^A a w.

Plusieurs utilisateurs

Enfin, screen permet à plusieurs utilisateurs de se connecter à une même session en même temps. Screen fournit une liste d'accès (ACL) à la session et donne des autorisations de lecture / écriture / exécution pour chaque utilisateur de la liste. Il permet même de gérer un groupe d'utilisateurs. Une bonne raison d'utiliser cette fonctionnalité serait de regarder un code source à plusieurs en même temps, comme cela on évite toute ambiguïté sur la partie du code dont on parle, etc.

Pour qu'une autre personne puisse se connecter à votre session screen, vous devez activer le mode multi-utilisateur de screen avec ^A : multiuser on. Ensuite, vous attribuez à un autre utilisateur le droit de se connecter avec ^A : aclchg david +r "#". Cela veut dire que l'utilisateur système david a la permission de voir toutes les fenêtres de cette session. Vous pouvez spécifier plusieurs utilisateurs, les droits d'écriture (w) et d'exécution (x), et certaines fenêtres. Faites attention aux droits d'exécution qui permettent à d'autres personnes de créer des fenêtres et de changer les droits via les acl.

Maintenant, l'utilisateur auquel vous avez donné accès peut se connecter via la commande :

$ screen -r chris/

Vous pouvez supprimer les droits aux autres utilisateurs quand vous le souhaitez avec acldel david. Comme pour tout système multi utilisateur, il y a de nombreuses implications pour la sécurité et les fonctionnalités d'accès. Utilisez ces fonctions avec précaution et lisez attentivement la page de manuel pour les détails.

Paramétrage avec $HOME/.screenrc

Les fichiers de configuration de screen sont /etc/screenrc et $HOME/.screenrc. Les valeurs inscrites dans le deuxième, votre fichier de configuration, sont prioritaires par rapport à celles saisies dans le fichier de configuration général, dans /etc. Vous pouvez tester des options de configuration en utilisant screen et les ajouter dans votre fichier .screenrc pour les rendre permanentes. Presque toutes les options qui peuvent être passées en ligne de commande, sous screen peuvent être ajoutées au fichier de configuration. Je vais juste vous en montrer quelques-unes, rendez vous au manuel de screen pour en connaître l'ensemble.

Alarme visuelle

Au lieu d'émettre un son, l'alarme visuelle affiche un message lorsqu'il se passe quelquechose. Le message par défaut est assez ridicule :"Wuff ---- Wuff!! ". Vous pouvez le modifier avec la ligne suivante :

vbell_msg "beep"

Touches liées

Vous pouvez ajouter vos propres commandes liées à des touches. Par exemple, voici une touche liée qui ouvre une nouvelle fenêtre avec une session ssh sur un autre ordinateur :

bind 'R' screen ssh root@foc-gw-1

Désormais, si vous tapez ^A^R, vous ouvrirez une nouvelle fenêtre contenant une session ssh. Comme vous pouvez le voir, vous avez toujours besoin de ^A pour que screen prenne en compte vos commandes. Bien-sûr, les touches liées peuvent devenir beaucoup plus complexes que ça.

Bricolage des options du terminal

Screen vous permet de modifier les capacités de votre terminal (NdT : terminfo, anciennement termcap) sans avoir à créer un nouveau fichier de configuration à la main. Je ne vais pas vraiment entrer dans les détails, juste mentionner cette fonctionnalité. Je ne comprends pas vraiment tout sur termcap donc je n'en parle pas trop. Si vous savez ce dont vous avez besoin pour éditer la configuration du terminal, vous pouvez le faire à travers screen. Voici un exemple différent de la configuration par défaut :

termcap vt100 dl=5\E[M

Fenêtres de démarrage

Vous pouvez indiquer toutes sortes de fenêtre à ouvrir lorsque vous lancez screen. Listez les dans votre fichier screenrc avec la commande screen, comme suit :

screen 0 ssh chris@ziggy -e pine
screen 1 vim ~/src/manos/src/kern/GNUmakefile
screen 2 ssh -X root@uni

Ligne d'état fantaisie

J'ai indiqué plus tôt que vous pouviez afficher constamment quelles fenêtres étaient ouvertes pour permettre de basculer de l'une à l'autre plus facilement. On le fait en utilisant la ligne d'état (hardstatus line). Par défaut, l'état va dans la barre de titre d'un xterm ou en bas de l'écran sur la console. Cependant, vous pouvez obliger la ligne d'état à rester en bas de votre écran en ajoutant ceci dans votre fichier .screenrc :

hardstatus on
hardstatus alwayslastline

Ensuite il vous faut paramétrer cette ligne pour qu'elle affiche les informations qui sont susceptibles de vous intéresser. La ligne d'état qui suit affiche une liste de toutes les fenêtres avec leur numéro à gauche, la date et l'heure à droite :

hardstatus string "%w%=%m/%d %c"

Bien sûr vous pouvez ajouter du piment en colorant le texte, inclure la sortie d'un programme comme fortune, etc. Allez voir la page de manuel, section "STRING ESCAPES" pour plus de détails.

Conclusion

Screen est un programme complexe et puissant pour gérer des programmes interactifs en ligne de commandes, de la même façon qu'un gestionnaire de fenêtres gère les programmes graphiques. Cependant, screen est plus puissant qu'un gestionnaire de fenêtres puisqu'il vous permet de vous attacher et de vous détacher de programmes en fonctionnement comme vous le souhaitez. J'ai couvert quelques-unes de ses fonctionnalités dans cette présentation. La page de man est beaucoup plus complète.

L'original de cette présentation est disponible à l'adresse : http://www.bangmoney.org/presentations/screen.html et le copyright revient à Chris Lumens (c) 2004.