Le multiplicateur de terminal screen

Pour pouvoir utiliser la commande screen, il faut d'abord installer le package du même nom. Ensuite, on peut utiliser screen en tapant tout simplement :

screen

À partir de là, on entre alors dans une « session screen ». Il faut voir une session screen ni plus ni moins comme une session graphique. En effet, dans notre session screen, on va pouvoir ouvrir ce que screen appelle dans sa page de manuel des « fenêtres » : ce sont tout simplement des terminaux (sous bash si bash est notre shell par défaut) qui s'exécutent au sein de notre session screen. Comme dans une session graphique, on va pouvoir ouvrir plusieurs fenêtres, en afficher qu'un seule sur notre « Bureau » ou bien en afficher plusieurs sur des régions séparées de notre « Bureau », et bien sûr on va pouvoir fermer nos fenêtres. Au passage, autant le terme de fenêtre est bel et bien utilisé dans la page de manuel de screen, autant le terme de « Bureau » est tout à fait personnel (mais très adapté je trouve).

Les commandes screen commencent toujours par la combinaison de touche CTRL+a.

  • CTRL+a puis ? permet d'afficher une page d'aide ;
  • CTRL+a puis S permet de découper notre « Bureau » horizontalement en deux régions (avec CTRL+a puis | on peut découper notre « Bureau » verticalement) ;
  • CTRL+a puis TAB permet de basculer d'une région à l'autre de notre « Bureau » (à condition que notre « Bureau » soit découpé en plusieurs régions) ;
  • CTRL+a puis Q permet de revenir à un « Bureau » avec une seule fenêtre (celle ayant le focus au moment où la combinaison de touches est saisie) occupant la totalité du « Bureau » (mais cela ne ferme pas les autres fenêtres qui sont toujours actives) ;
  • CTRL+a puis c permet d'ouvrir (c = Create) une nouvelle fenêtre. Si on se trouve déjà dans une fenêtre au moment de cette action, alors la nouvelle fenêtre créée va masquer la précédente. Dans ce cas, CTRL+a puis " permet de basculer d'une fenêtre à l'autre ;
  • On ferme une fenêtre comme on ferme n'importe quelle session sous console, à savoir avec la commande exit ou bien avec la combinaison CTRL+d. On peut aussi utiliser la combinaison «made in» screen CTRL+a puis k. Si jamais il ne reste plus de fenêtre active, alors notre session screen se termine et on retombe dans le terminal classique. En revanche, s'il reste encore au moins une fenêtre toujours active, alors on retombe dans l'une d'entre elles (peu importe qu'on ait ouvert plusieurs régions ou non) et la session screen est toujours active.

Avec tout ça, screen permet d'avoir sous les yeux deux (ou plus) consoles, enfin fenêtres plutôt, simultanément ouvertes sur une seule session screen. Sur un serveur sans interface graphique, on peut par exemple découper la session screen en deux régions : sur celle du haut est affichée une fenêtre screen sur laquelle on effectue des commandes, et sur celle du bas est affichée une deuxième fenêtre screen sur laquelle on visualise en temps réel ce qui est écrit dans le fichier syslog. Au passage la commande qui permet de faire cela est :

tail -f /var/log/syslog

Ou on peut visualiser en temps réel la sortie de la commande top etc.

Mais screen présente des avantages supplémentaires encore plus intéressants. Pour commencer, ce qu'on exécute dans une session screen est exécuté en mode nohup. Concrètement, cela signifie que :

  • Si on est connecté à un serveur via ssh et que l'on exécute une commande assez longue sous une session screen, même si la connexion est coupée (suite à un problème réseau), la commande continuera à s'exécuter et on pourra même reprendre le fil de notre session screen lors d'une prochaine connexion ;
  • On peut même reprendre en cours de route une session screen après s'être déconnecté d'un ordinateur.

Voici une petite démonstration. Ouvrez une session via Gnome-terminal puis lancez screen. Lors de la session screen, exécutez ce script bash (idiot) :

# Script qui compte (assez vite) de 1 à 1000.
c=$((1))
while [ $c -le 1000 ] ; do
    echo $c
    c=$((c+1))
    sleep 0.1
done

Pendant l'exécution de ce script, fermez brutalement votre fenêtre Gnome-terminal et tant qu'à faire déconnectez vous carrément du système (autrement dit, fermez votre session sans toutefois redémarrer l'ordinateur). Ensuite, reconnectez vous au système (sous le même compte que précédemment), ouvrez à nouveau un Gnome-terminal et tapez :

$ screen -ls
There is a screen on:
	29263.pts-0.flpc	(15/08/2011 01:07:12)	(Detached)
1 Socket in /var/run/screen/S-francois.

Cela signifie qu'on a une session screen en mode « détaché », suite à l'interruption brutale de notre session Gnome-terminal. On peut alors reprendre cette session screen en tapant :

# «-r» pour «resume» (reprendre)
$ screen -r

Vous devriez alors retrouver votre session screen précédente avec le script qui doit être probablement encore en train de se dérouler (mais qui doit se trouver à un stade un peu plus avancé que précédemment). Attention, vous allez retrouver votre session screen avec toutes ses fenêtres actives, mais en revanche la disposition de celles-ci (par exemple deux fenêtres affichées sur un « Bureau » coupé en deux) sera perdue. Vous aurez vos fenêtres actives disponibles mais, au départ, une seule sera affichée sur la totalité du « Bureau ».

On peut se « détacher » d'une session screen autrement qu'en provoquant une fermeture brutale du Gnome-terminal. On peut se « détacher » d'une session screen proprement avec la combinaison CTRL+a puis d. Sur un serveur (sans interface graphique), cela peut être très pratique : on se connecte en ssh, on lance screen et on effectue une commande (assez longue). On se détache de la session screen et on se déconnecte même du serveur. Une heure plus tard, on peut se reconnecter en ssh au serveur et reprendre notre session screen pour voir où en est notre commande.

Enfin, autre avantage de screen, on peut partager une même session screen à deux. Ouvrez une fenêtre Gnome-terminal F1 et lancez screen. Tapez quelques commandes sans intérêt histoire de remplir la console. Ensuite, ouvrez une autre fenêtre Gnome-terminal F2 et tapez :

$ screen -ls
There is a screen on:
	30961.pts-0.flpc	(15/08/2011 01:37:21)	(Attached)
1 Socket in /var/run/screen/S-francois.

On voit bien qu'une session screen est ouverte mais celle-ci est en mode « attaché » puisque nous y sommes connecté sur la fenêtre F1. Sur la fenêtre F2, tapez alors :

# Permet de se connecter à une session screen déjà attachée.
# « screen -r » échouera car il permet de reprendre des sessions 
# screen en mode « détaché » uniquement.
$ screen -x

Vous devriez alors avoir la même session screen sur les deux fenêtres F1 et F2. Si vous tapez quelque chose sur F1, cela devrait apparaître en temps réel sur F2 et inversement. Ceci peut se révéler très pratique pour dépanner quelqu'un sur un serveur. Supposons qu'une personne soit connectée sous root sur son serveur et qu'elle ait ouvert une session screen. Si vous vous connectez sous root (via ssh par exemple) sur ce même serveur et si vous vous « attachez » à la même session screen via screen -x, vous vous partagerez alors tous les deux exactement la même console. S'il tape quelque chose sur la console, vous le verrez immédiatement sur la votre et inversement.

Cette entrée a été publiée dans Commandes pratiques, avec comme mot(s)-clef(s) . Vous pouvez la mettre en favoris avec ce permalien.

Les commentaires sont fermés.