Vendredi 2 août 2019

Cher Journal,

Au détour de quelques recherches sur les ordonnanceurs de tâches disponibles dans Debian, le paquet task-spooler s'est avéré être un résultat intéressant.

Outils de base

Sur un Unix classique, le contrôle des jobs batch est laissé au shell, qui permet d'exécuter des lignes de commandes les unes après les autres. Typiquement pour copier un fichier, la commande suivante va se lancer, et puis rendre la main à l'utilisateur une fois que la copie est terminée, ce qui peut prendre du temps sur les gros fichiers :

$ cp fichier /vers/un/autre/emplacement/
_

Le temps passe avant que le shell ne rende la main, ce qui finit par arriver, imperceptiblement si le fichier est très petit, ou bien longtemps après, si le fichier est très gros :

$ cp fichier /vers/un/autre/emplacement/
$ _

En attendant, rien d'autre ne peut se passer, du moins dans cette session de shell. À une exception près ceci dit, la commande peut être mise en pause en utilisant une combinaison de touches pour envoyer au programme cp un signal SIGSTOP, par exemple en shell Posix en utilisant la combinaison de touches Ctrl+Z :

$ cp fichier /vers/un/autre/emplacement/
^Z
$ _

Le shell rend immédiatement la main, mais la copie est interrompue. La commande jobs permet d'afficher l'état du programme :

$ jobs
[1]+  Stopped   cp fichier /vers/un/autre/emplacement/

Le programme cp peut être redémarré en avant plan avec la commande shell fg, c'est-à-dire que la main sera à nouveau rendue à la fin de la copie, ou bien avec la commande bg, qui laissera redémarrer le programme en arrière plan, ce qui signifie que même si la copie est encore en cours, la main est tout de même rendue immédiatement :

$ bg
[1]+ cp fichier /vers/un/autre/emplacement/ &
$ _

Une remarque intéressante est l'apparition d'une esperluette à la fin de la commande. Ce symbole peut être utilisé pour lancer directement une commande en arrière plan :

$ cp fichier /vers/un/autre/emplacement/ &
[1] 1102
$ _

Éventuellement, après la fin de la copie, une notification apparaîtra au milieu de la session de shell pour indiquer la fin de la copie :

$ ⏎
[1]+  Done      cp fichier /vers/un/autre/emplacement/
$ _

Le shell fournit un ensemble de commandes pour contrôler l'exécution des programmes de manière séquentielle malgré le rendu de la main directement après mise en arrière plan, notamment via la commande wait :

$ wait %1 ; cp second_fichier /vers/encore/un/autre/emplacement/ &

Tout ceci est détaillé dans la section Job control de la page de manuel de bash(1).

Mais soyons honnête, ces manipulations sont lourdes !

Le task spooler

Cet outil permet de chaîner facilement des tâches pour les exécuter de manière séquentielle sans pour autant avoir à se gratter la tête avec les commandes builtin que sont bg, jobs, wait, etc. Pour en disposer, le paquet task-spooler est requis, mais pas installé par défaut :

$ sudo apt install task-spooler

Le site du task spooler et la documentation de tsp(1) indiquent que la commande est ts. Toutefois, dans Debian, à cause d'un conflit avec la commande ts fournie par OpenSSL, la commande à utiliser devient tsp.

L'exemple le plus représentatif d'un usage du Task Spooler est la possibilité d'imiter le comportement du vénérable programme SuperCopier, un programme disponible de mémoire sous Windows XP, qui délayait les copies de fichiers afin d'éviter les oscillations de tête de lecture du disque, et donc d'éviter une chute catastrophique des performances de la machine. Pour mimer ce comportement avec la commande cp donc, placer tsp en préfixe de la commande de copie fait l'affaire :

$ tsp cp -r répertoire3/ /vers/ailleurs/
0
$ tsp cp gros_fichier /vers/ici/
1
$ tsp rsync -axSH --delete /data/ /data-bck/
2

La première commande va déclencher la copie du répertoire répertoire3 vers le répertoire /vers/ailleurs ; cette commande se verra attribuer le identifiant de job tsp numéro 0. La main est rendue immédiatement après le déclenchement de la copie. La deuxième commande se voit attribuer l'identifiant 1, et déclenchera la copie du gros_fichier vers /vers/ici, mais pas avant que le job 0, autrement dit la copie du répertoire3 vers ailleurs, ne soit terminée. La dernière commande effectue une sauvegarde du /data vers le répertoire /data-bck, et qui ne sera déclenchée que quand les jobs 0 et 1, c'est-à-dire les deux précédentes copies de fichiers, seront terminées.

La commande tsp fournit l'option -l, qui permet de savoir quel est l'état des jobs qui ont été soumis à la machine. Voici un exemple de sortie de cette commande, obtenu lors de la récupération d'une sélection de diverses musiques depuis un disque d'archivage :

$ tsp -l
ID   State      Output               E-Level  Times(r/u/s)   Command [run=1/1]
28   running    /tmp/ts-out.WzODyy                           cp -r Stratovarius /home/tokamak/musique/
29   queued     (file)                                       cp -r lost_years /home/tokamak/musique/
30   queued     (file)                                       cp -r olafur-arnalds /home/tokamak/musique/
21   finished   /tmp/ts-out.YDVNxK   1        0.00/0.00/0.00 cp PostRockMusicPack /home/tokamak/musique/
22   finished   /tmp/ts-out.BktTpK   1        0.00/0.00/0.00 cp SonataArctica /home/tokamak/musique/
23   finished   /tmp/ts-out.04Qw2I   1        0.00/0.00/0.00 cp Stratovarius /home/tokamak/musique/
24   finished   /tmp/ts-out.L2jVHI   1        0.00/0.00/0.00 cp Vangelis /home/tokamak/musique/
25   finished   /tmp/ts-out.TOQCFI   0        38.71/0.02/1.88 cp -r Vangelis/ /home/tokamak/musique/
26   finished   /tmp/ts-out.inzmTC   0        31.37/0.02/1.50 cp -r PostRockMusicPack /home/tokamak/musique/
27   finished   /tmp/ts-out.TKjbty   0        90.20/0.05/4.41 cp -r SonataArctica /home/tokamak/musique/

La première colonne indique l'identifiant du job, la seconde colonne indique son état :

Afin de permettre aux divers programmes de sortir des résultats, éventuellement des messages d'erreur, comme ce fut le cas lors de mes oublis d'option -r à la commande cp, pour les jobs 21 à 24, les fichiers temporaires /tmp/ts-out.* peuvent être consultés dès l'instant où le programme a commencé à tourner.

Outre l'option -l, tsp fournit quelques options pour gérer les entrées des jobs dans la file d'attente. Les options les plus notables sont :

Plein d'autres options sont disponibles et documentées dans la page de manuel de tsp(1). Un fichier intitulé TRICKS, caché dans /usr/share/doc/task-spooler, contient également des astuces pour avoir différentes files d'exécution, via l'usage de différentes socket, fournies via la variable d'environnement TS_SOCKET.

Une dernière note avant de passer à la suite, faire un peu de ménage dans queue du Task Spooler est régulièrement bienvenu, sans quoi lancer un tsp -l devient un capharnaüm impossible. Comme indiqué précédemment tsp -C permet de faire le ménage dans les jobs finis :

Le boulet de démolition pour écraser la mouche

Divers autres programmes sont disponibles pour gérer ses tâches dans Debian. Les plus connus sont des outils dédiés à un usage scientifique, avec plein de machines distribuées en centre de calcul, voir dans le monde en prenant l'exemple du projet BOINC. Moins connu du grand publique, le projet Slurm permet d'ordonnancer des jobs sur une grappe de machines, mais sur une seule machine c'est plus rapide de déployer le paquet task-spooler. Le projet Torque mérite également d'être mentionné, mais ne fait pas partie de Debian, probablement faute de respect des DFSG.

[ICO]NameLast modifiedSize
[PARENTDIR]Parent Directory  -

  —