Linux : utiliser screen pour gérer les tâches exécutées en arrière-plan

Il est possible de lancer une tâche en arrière-plan dans un terminal en ajoutant une esperluette (&) à la fin d’une ligne de commande ou, si la commande est déjà lancée, en utilisant la combinaison de touches CTRL+Z pour arrêter la tâche associée à la commande bg pour relancer la tâche et à la commande fg pour la remettre au premier plan, mais cette solution présente quelques inconvénients, notamment lorsque la machine est administrée à distance (configuration headless). Screen est un petit utilitaire qui permet de contourner certaines de ces difficultés.

Voies de chemin de fer parallèles.

Screen permet d’exécuter des tâches en arrière-plan sans maintenir ouvert le terminal dans lequel elles ont été lancées, et sans collision. Source : xlibber, image sous licence Creative Commons.

Dans quel cas utiliser screen ?

C’est particulièrement utile lorsqu’on doit lancer à distance (par exemple sur une machine administrée via une connexion SSH) une tâche dont l’exécution promet d’être longue (comme par exemple la synchronisation « manuelle » de fichiers entre deux unités de stockage en réseau, en utilisant le protocole et la commande rsync).

Screen permet d’ouvrir un terminal virtuel, d’y lancer une tâche et de la laisser tourner, de quitter la session ainsi ouverte et de fermer tranquillement le terminal ouvert sur la machine, puis d’y revenir pour voir si tout s’est bien déroulé.

Screen s’installe très simplement et se trouve dans les dépôts de la plupart des distributions.

Sous Arch Linux ARM, par exemple, screen n’est pas embarqué dans la distribution par défaut, et il faut l’installer en passant la commande :
# pacman -S screen

Exemple concret : utilisation de screen pour lancer et suivre le déroulement de la synchronisation entre une machine-source et une machine-cible fonctionnant comme un serveur de sauvegarde

Lancement de rsync pour synchroniser le contenu du répertoire /media/hdd/ de la machine source avec le répertoire /media/SauvegardeHDD/ de la machine cible, les deux machines étant connectées au réseau (avec respectivement X.X.X.X et Y.Y.Y.Y comme adresses IP) et administrées à distance via une connexion SSH.

Méthode classique sans utiliser screen et en conservant la tâche au premier-plan

Une première solution est d’ouvrir un terminal sur la machine-source, d’y lancer la commande rsync et d’attendre qu’elle se termine :
$ ssh root@X.X.X.X
# rsync /media/hdd/ utilisateur@Y.Y.Y.Y/media/SauvegardeHDD

mais pour reprendre la main sur le terminal et accomplir une autre tâche, si la tâche lancée en premier doit durer 4 heures, ça risque de devenir hum… plutôt pénible !

Méthode classique plus élégante sans utiliser screen en envoyant la tâche à l’arrière-plan

Une deuxième solution est d’envoyer la tâche à l’arrière-plan lors du passage de la commande en ajoutant une esperluette à la fin de la ligne de commande :
$ ssh root@X.X.X.X
# rsync /media/hdd/ utilisateur@Y.Y.Y.Y/media/SauvegardeHDD &

Pour la récupérer, il suffit alors de passer la commande :
# fg
ou a posteriori :
$ ssh root@X.X.X.X
# rsync /media/hdd/ utilisateur@Y.Y.Y.Y/media/SauvegardeHDD

Ctrl + Z pour arrêter la tâche et l’envoyer à l’arrière-plan.
Puis
# bg
pour la démarrer en arrière plan.
Pour la récupérer :
# fg
Mais si on vient à fermer le terminal ouvert à distance sur la machine-source, l’exécution de la commande risque elle aussi d’être interrompue. Il faut donc laisser ouvert un terminal sur la machine-source, c’est à dire maintenir la connexion ce qui est… relativement pénible et surtout inutile.

Méthode simple et pratique en utilisant screen

La solution avec screen :
On ouvre un terminal sur la machine-source :
$ ssh root@X.X.X.X
On crée une session (nommée par exemple synchr avec screen :
# screen -S synchro
Dans la session ainsi ouverte sur la machine-source, on lance la commande longue et pénible à regarder s’étirer dans le temps :
# rsync /media/hdd/ utilisateur@Y.Y.Y.Y/media/SauvegardeHDD
La commande démarre, et on peut détacher la session et la laisser tourner tranquillement en arrière-plan :
Ctrl +A D
On retourne dans le terminal ouvert initialement sur la machine source, et on peut le fermer sans attendre la fin de la commande chronophage :
# exit

Pour revenir voir où en est la tâche attendue mais longue, on peut rentrer à nouveau (après avoir ouvert un terminal à distance via SSH) dans le terminal virtuel créé précédemment (et qui, dans mon exemple, était nommé synchro) :
# screen -r synchro

Et ainsi de suite…

Références pour aller plus loin :
Manuel de screen (passer la commande man screen dans un terminal) ;
Description de screen dans la documentation Ubuntu.

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.