Skip navigation

Bon, alors, qu’est ce que c’est que ce barbarisme, « multiplexeur de terminaux » ?

Eh bien en fait, screen (on devrait dire GNU/Screen, comme on devrait dire GNU/Linux au lieu de Linux) est une sorte de gestionnaire de fenêtres en mode texte. Il vous permet de lancer plusieurs logiciels en mode texte au travers d’une seule et même interface.

Vous me direz, mais si je lance mes programmes avec &, et que j’utilise les commandes fg et bg, ainsi que jobs, je peux lancer plusieurs programmes dans un terminal, alors, quel intérêt a Screen ?

Eh bien tout simplement, si vous fermez votre session SSH, ou que vous fermez votre émulateur de terminal, avec la méthode « classique », toutes les applications lancées sur la tty s’arrêteront en même temps, ou continueront à tourner sans pouvoir les récupérer. Avec screen, il vous suffira de rattacher screen à un autre terminal, pour récupérer vos applications, comme si vous n’aviez pas été déconnecté. C’est très utile par exemple si vous avez un serveur dédié et que votre chien/chat/copine/belle-mère s’est pris les pieds dans les câbles, et que vous avez perdu votre connexion SSH, ou si vous bidouillez votre xorg.conf et relancez souvent X, pour, par exemple, avoir toujours un client irc (irssi, weechat… pratique pour demander de l’aide si vous avez des problèmes de conf’ ), un gestionnaire de fichiers (mc…), un éditeur de texte léger (vim, emacs, joe…), etc etc, à portée de la main, quoiqu’il arrive tant qu’il ne s’agit pas d’un reboot de la machine.

I – Commandes de base de Screen.

Tout d’abord, vérifiez que screen est installé sur votre système. Si ce n’est pas le cas, installez-le via votre gestionnaire de paquets favori.

Une fois ceci fait, ouvrez un terminal, puis tapez simplement « screen » à l’invite de commande. Un message (que l’on peut désactiver) devrait apparaître, signifiant que screen est bien lancé, puis une invite de commande standard. Lancez un de vos programmes console préféré, par exemple, un client irc (irssi ou autre). Jusque là, rien de bien folichon.

Maintenant, tapez la combinaison de touches suivantes : Ctrl-a, puis c (pour [c]reate). Mais où est donc passé irssi?

En fait, screen a ouvert un nouvel « écran », et un nouveau shell. irssi tourne toujours sur le premier écran, mais vous ne le voyez pas car il est « recouvert » par le nouvel écran. Pour revenir à l’écran précédent, tapez: Ctrl-a p – je noterai désormais C-a pour la combo Ctrl-a – Bien évidemment, si vous tapez C-a n, vous repassez à l’écran suivant.

Maintenant, ouvrez un nouvel émulateur de terminal, et tapez « screen -list », vous devriez voir quelque chose comme ça :

[lidstah@kadath] ~/ $ screen -list

There is a screen on:

19344.pts-1.kadath (Attached)

1 Socket in /tmp/screens/S-lidstah.

Ici, on voit donc qu’il y a un screen, de pid 19344 (c’est utile si vous en avez plusieurs), sur ma machine « kadath » (oui, je nomme mes machines selon les noms de villes du mythe de Cthulhu, de H.P.Lovecraft, y’en a c’est Tolkien, moi c’est Lovecraft, na), et qu’il est (Attached) – c’est ce qui nous intéresse.

Maintenant, tapez screen -dr. Miracle, votre session screen s’est téléportée d’un terminal à l’autre! Qu’avons nous fait avec cette ligne de commande? screen -d détache screen (screen -d PID lorsqu’on en a plusieurs, on peut aussi les nommer, j’y reviendrai plus tard), screen -r le rattache sur le terminal courant. screen -dr détache screen et le rattache sur le tty ou le terminal où la commande a été invoquée.

Maintenant, dans screen, tapez la commande suivante : C-a d – non, screen n’a pas disparu, il est détaché et non rattaché, un simple screen -r permet de le rattacher.

Vous commencez à voir l’intérêt, notamment dans le cas de l’administration d’un serveur distant ?

Une petite liste des raccourcis clavier de screen (non exhaustive) :

  • C-a A permet de renommer une « fenêtre »
  • C-a : permet de lancer une commande de screen. Très important dans le cadre d’un travail collaboratif, pour autoriser/interdire l’accès à votre session screen à d’autres utilisateurs de la même machine, via les commandes acladd / acldel, mais on y reviendra plus tard.
  • C-a c crée une nouvelle fenêtre, qui démarre avec un nouveau shell (votre shell de login, /bin/bash généralement, mais aussi zsh, tcsh, ksh, etc etc tout dépend de vos goûts et de votre config (zsh est pas mal, bash est le plus courant, tcsh était le shell de base de pas mal de *BSD et d’OS X version < 10.3, ksh aka « Korne Shell » est assez souvent vu sur AIX, si je me rappelle bien, et aussi sous AmigaOS < 4.0 )
  • C-a p ; C-a n permettent de passer d’une fenêtre à l’autre (dans le split courant! cf plus bas)
  • C-a a revient à la fenêtre précédente
  • C-a d détache screen
  • C-a 0..9 sélectionne la fenêtre numéro 0..9
  • C-a ” affiche la liste des fenêtres ouvertes dans un menu
  • C-a [ lance le mode de copie. déplacez le curseur au début de votre sélection avec les touches fléchées, appuyez sur Entrée, déplacez le curseur à la fin de la sélection, rappuyez sur Entrée pour copier.
  • C-a ] Colle le contenu du tampon précédemment créé
  • C-a S splitte la fenêtre en deux
  • C-a TAB cycle entre les « splits »
  • C-a k « kille » la fenêtre courante
  • C-a x « locke » le terminal (il faudra taper votre mot de passe pour revenir à la session, pratique dans le cas d’un serveur dédié ou de voisinage indiscret, voire, de patron trop curieux 🙂 )
  • C-a ? affiche l’aide.

Bon, après cette liste non-exhaustive, nous allons pouvoir passer au…

II – Les options de la ligne de commande de screen.

On a déjà vu que screen -d pid/sessionname permet de détacher le screen numéro « pid » ou de nom « sessionname » (retenez ce mot, c’est la commande (C-a :sessionname blabla ) qui vous permet de renommer un screen en cours d’exécution.) et screen -r pid/sessionname de le rattacher.

Maintenant, une petite liste (non-exhaustive là encore) des options de la ligne de commande de screen, avant de passer à la configuration de screen :

  • -S blabla : screen aura pour nom de session « blabla »
  • -ls ou -list : liste les sessions déjà lancées, avec leur pid et leur sessionname.
  • -d : détache une session
  • -r : rattache une session
  • -D -R, -DR : la même, version gros bill impatient.
  • -c fichierdeconfig : utilise fichierdeconfig au lieu de $HOME/.screenrc – Pratique pour tester une config vite fait, ou pour avoir des réglages différents pour plusieurs screen.
  • -p nom ou numéro : conjointement avec -r, permet de réattacher directement à la fenêtre numéro/nom
  • -s chemin_du_shell : permet de lancer screen avec un autre shell que celui par défaut ($SHELL ou /bin/sh), exemple : screen -s /bin/zsh
  • -x : attache screen à une session déjà attachée. En gros, vous êtes attaché à la maison en même temps qu’au bureau.

Bon, tout ça s’est bien beau, mais comment on configure le .screenrc ?

III – Configuration de screen : le fichier ~/.screenrc

Tout d’abord, ça se passe donc dans ce fameux fichier .screenrc, qui se trouve, comme pas mal de fichiers de conf, dans le répertoire $HOME/.

Puisqu’un exemple est plus parlant que trois tonnes de blabla insipide, je vais déjà vous montrer le mien, et le décortiquer, puis ensuite je vous donnerai un lien qui répertorie toutes les commandes de configuration (notamment pour les lignes hardstatus et caption) :

startup_message off

caption always « %{wk}%h %=%c »

hardstatus alwayslastline « %{=b}%{G}Screen(s): %{w}%-Lw%n%f* %t%{-}%{w}%+Lw%=%{G}Connected to %H%{G} Load: %l »

screen 0 irssi

screen 1 slrn

screen 2 vim

screen 3 mc -b

Bon, commençons par le début, c’est le plus simple…

startup_message off: Pour ne plus avoir le message de début (trop dur, hein? 🙂 )

Maintenant on va attaquer les trucs rigolos :

caption always « %{wk}%h %=%c »: toujours réserver une des lignes du bas pour le « caption »

  • %{wk} : tout ce qui est entre crochets (précédé d’un %) est une modification de style ou de couleur. Ici, blanc (white) en avant-plan et k, noir
  • %h : le titre de la fenêtre s’il y’en a un ( par exemple la chanson courante avec ncmpcpp/mpd )
  • %=%c : %= aligne à droite (grosso modo), %c : l’heure 🙂

hardstatus alwayslastline « %{=b}%{G}Screen(s): %{w}%-Lw%n%f* %t%{-}%{w}%+Lw%=%{G}Connected to %H%{G} Load:%l »: Elle est rigolote celle là hein ? 🙂

  • hardstatus alwayslastline : la ligne de hardstatus, toujours en dernière ligne, toujours visible, comme pour le caption always précédent.
  • %{=b} : = dans un {} = remet les valeurs à zéro, b signifie en gras sur toute la ligne s’il te plaît
  • %{G}Screen(s): : « Screen(s): » en vert clair s’il te plaît, « Screen(s) » apparaît donc en vert clair, gras.
  • %{w} : en blanc pour la suite (et elle est fun la suite, owi qu’elle est fun)
  • %-Lw%n%f*%t%{-}%{w}%+Lw : miam, imbuvable, pas vrai ? Mais non, c’est en fait assez simple (sisi je vous jure). %-Lw signifie liste moi les fenêtres avant celle que j’ai sélectionné, %n, affiche moi le numéro de ma fenêtre actuelle, %f* avec une étoile à côté de son numéro, %t affiche le nom de ma fenêtre, %{-} enlève les attributs précédents (liste des fenêtres avant la fenêtre courante), %{w}+Lw affiche moi la liste des fenêtres courantes après la mienne, %= justifie à droite, %{G} en vert clair stp, %H hôte (machine), %l charge CPU de la machine.
  • screen 0 irssi : la première fenêtre lancera irssi, screen 1 slrn : la deuxième lancera slrn, etc etc. En gros je tapes screen, ça me donne ça chez moi :

Alors, c’est pas si balèze que ça, si ?

pour la liste complète des opérandes disponibles, allez voir sur le lien suivant :

http://www.gnu.org/software/screen/manual/screen.html

Section 21 –  String Escapes.

Vali Valou pour aujourd’hui, demain, je vous fait un article complémentaire sur le travail collaboratif via screen, ainsi qu’un article sur irssi, ils seront plus courts, par contre.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

What is 12 + 6 ?
Please leave these two fields as-is: