Comment surveiller la progression des commandes Linux (avec pv et progression)



Au lieu de naviguer à l’aveuglette, tirez parti des commandes Linux `pv` et `progress` pour observer l’évolution d’une opération en cours. Ces outils vous offrent des barres de progression pour des commandes qui, habituellement, n’en disposent pas. De plus, vous aurez une estimation du temps restant avant la fin.

Lors d’un long voyage en avion, sans écran de divertissement intégré dans le siège, il est difficile d’apprécier où l’on se situe. On sait quand le décollage a eu lieu et la durée prévue du vol. Mais comment savoir si l’on est dans les temps, en avance, ou en retard ? Si le film proposé ne vous tente pas, il est généralement possible de basculer l’écran pour afficher une carte avec la position de l’appareil, accompagnée de données comme l’heure d’arrivée estimée (ETA), ce qui est très utile.

Lancer une commande dans une fenêtre de terminal peut parfois donner la même sensation qu’un vol long-courrier sans affichage. On manque d’informations permettant de savoir si l’opération se déroule normalement ou si elle est bloquée, et on ignore l’état d’avancement. Un curseur clignotant n’est pas d’une grande aide.

Les commandes `pv` et `progress` vous fournissent des statistiques et un retour visuel. Vous pouvez constater à quel point le processus est près de son achèvement. Cela signifie que vous obtenez un ETA pour vos processus en cours. C’est beaucoup plus instructif que de fixer un curseur immobile.

Installation de `pv`

L’installation de `pv` est nécessaire.

Pour installer `pv` sur Ubuntu, utilisez la commande suivante:

sudo apt-get install pv

Pour installer `pv` sur Fedora, utilisez cette instruction:

sudo dnf install pv

Pour installer `pv` sur Manjaro, exécutez la commande ci-dessous:

sudo pacman -Syu pv

Utilisation de `pv`

`pv` signifie « pipe viewer » (visualiseur de canalisation). L’opération doit impliquer une canalisation à un moment donné. Voici un exemple où nous transmettons une image ISO via `zip` pour générer une archive zip compressée de l’ISO.

Pour que l’opération soit suffisamment lente afin de permettre une capture d’écran, certains des fichiers utilisés pour cet article ont été placés sur une vieille clé USB externe lente nommée SILVERXHD.

pv /media/dave/SILVERXHD/gparted-live-1.0.0-1-amd64.iso | zip > gparted.zip

De gauche à droite, les informations affichées sont :

Les données transférées jusqu’à présent.

Le temps écoulé jusqu’à présent.

Le taux de transfert de données (débit).

Une barre de progression et un pourcentage d’achèvement.

Le temps estimé restant avant l’achèvement (ETA).

Copie d’un fichier avec `pv`

Pour copier un fichier avec la sortie de `pv`, utilisez la commande suivante :

pv /media/dave/SILVERXHD/gparted-live-1.0.0-1-amd64.iso > gparted.iso

Nous recevons un rapport d’avancement à mesure que le fichier est copié.

Copie de plusieurs fichiers avec `pv`

Pour copier plusieurs fichiers et dossiers avec `pv`, une petite astuce est requise. Nous utilisons `tar` pour effectuer le transfert.

tar -c help-files/ | pv | tar -x -C Documents/

La partie `tar -c help-files/` de la commande demande à `tar` de créer (-c) une archive des fichiers présents dans le dossier `help-files`. Le résultat est transmis via `pv` pour obtenir un aperçu de la progression. Puis, il est redirigé vers `tar` pour la partie finale de la commande. L’archive est extraite (-x) et le répertoire est modifié (-C) pour `Documents` avant l’extraction.

Ainsi, les fichiers et dossiers contenus dans `help-files` sont copiés vers `Documents`, avec un affichage de la progression.

L’affichage est légèrement différent cette fois-ci.

L’ETA n’est pas disponible. La barre de progression est remplacée par un indicateur animé. Cela signale que le processus est actif, mais il ne progresse pas de gauche à droite comme une barre de progression classique. `pv` se contente de montrer les informations qu’il peut extraire du processus en cours de canalisation.

Utilisation de `pv` et `tar` pour créer une archive

La copie de fichiers avec `pv` et `tar` ne crée pas un fichier d’archive. Une archive « virtuelle » est créée par `tar`, qui est directement réinjectée dans `tar` pour extraire les fichiers. Si notre but est de copier des fichiers, c’est accompli. Mais comment faire si l’on désire créer un fichier archive ?

Il est toujours possible d’utiliser `tar` pour créer un fichier archive et obtenir un rapport d’avancement de `pv`. Les options utilisées avec `tar` sont `-c` (créer une archive), `-z` (compresser avec gzip) et `-f` (nom de fichier de l’archive).

Notez que nous utilisons `-` comme nom de fichier, ce qui force `tar` à utiliser la sortie standard (stdout), et à écrire son résultat dans la fenêtre du terminal. Nous ne voyons pas cette sortie car elle est acheminée via `pv`.

Le nom réel de l’archive sera le nom de fichier dans lequel nous dirigerons la sortie de `pv`. Dans ce cas, il s’agit de « help-files.tgz ».

tar -czf - ./help-files/ | pv > help-files.tgz

Les options d’affichage de `pv`

Plusieurs options peuvent être utilisées avec `pv` pour ajuster les détails du rapport.

L’utilisation d’une seule de ces options désactive toutes les autres. Donc, si vous désirez utiliser trois de ces options d’affichage, il faut les spécifier toutes les trois.

Utiliser `pv` sans option est équivalent à utiliser les options `-pterb`.

-p: affiche le pourcentage d’achèvement. C’est la barre de progression et le pourcentage complété.

-t: affiche le temps écoulé.

-e: affiche l’ETA.

-r: affiche le taux de transfert des données.

-b: affiche le nombre d’octets (données transférées jusqu’à présent).

-n: affiche le pourcentage sous forme d’entier. Cela affiche le pourcentage complété sous forme de nombre entier, avec chaque nouvelle mise à jour sur une nouvelle ligne.

Reprenons la dernière commande et ajoutons l’option `-p` (pourcentage complété) à `pv`.

tar -czf - ./help-files/ | pv -p > help-files.tgz

Utilisation de `pv` avec `wc`

Il est possible d’utiliser `pv` pour diriger un fichier texte (ou des fichiers) vers `wc`. `wc` compte alors les sauts de ligne, les caractères et les mots, et `pv` affiche un rapport d’avancement.

Ici, nous envoyons tous les fichiers « .page » du répertoire `help-files` vers `wc`.

Une fois que `wc` a terminé, nous pouvons observer le nombre de sauts de ligne (lignes), de caractères et de mots de tous les fichiers « .page » dans le dossier `help-files`.

Installation de la commande `progress`

La commande `progress` fournit le même genre d’informations utiles que `pv`, mais elle fonctionne avec un ensemble spécifique de commandes Linux.

Pour installer `progress` sur Ubuntu, utilisez cette instruction:

sudo apt-get install progress

Pour installer `progress` sur Fedora, employez cette commande:

sudo dnf install progress

Pour installer `progress` sur Manjaro, utilisez cette ligne de commande:

sudo pacman -Syu progress

Les commandes compatibles avec `progress`

Taper `progress` dans une fenêtre de terminal et appuyer sur Entrée affiche une liste des commandes que `progress` peut surveiller.

progress

Utilisation de `progress` avec des canalisations

Deux méthodes existent pour surveiller les commandes avec `progress`. La première consiste à utiliser des canalisations.

La commande `tar` fait partie des commandes prises en charge que `progress` peut suivre, donc utilisons `tar`.

Les options que nous allons utiliser sont les options habituelles : `-c` (créer une archive), `-z` (compresser avec gzip) et `-f` (nom de fichier). Nous allons générer une archive compressée de tout ce qui se trouve dans le dossier `help-files`, et l’archive sera nommée « help.tgz ».

Nous intégrons ceci à `progress` et utilisons l’option `-m` (monitor) pour que `progress` continue de suivre le processus jusqu’à son achèvement.

tar -czf help.tgz ./help-files/ | progress -m

La fenêtre du terminal affichera la progression de la commande `tar` lors de la création de l’archive.

À mesure que chaque fichier est traité, il est listé avec les informations suivantes :

L’ID du processus.

Le nom du processus.

Le pourcentage réalisé.

Les données traitées et la taille totale du fichier.

Le débit de données (taux).

Le temps restant estimé (ETA).

Il est possible d’être surpris de voir un second ensemble de données apparaître. Le premier ensemble de données concerne `tar`. Le second est pour `gzip`. `tar` fait appel à `gzip` pour effectuer la compression. Puisque `gzip` figure dans la liste des commandes prises en charge, `progress` fait des rapports sur celui-ci.

Utilisation de `progress` en mode de surveillance continue

Il est possible d’utiliser `progress` en mode de surveillance continue en temps réel avec l’option `-M` (moniteur).

Tapez la commande suivante dans une fenêtre de terminal:

progress -M

`progress` signalera qu’aucune commande n’est en cours d’exécution qu’il puisse surveiller. Mais vous n’êtes pas renvoyé à la ligne de commande. `progress` attend qu’une commande qu’il peut suivre démarre. Il commencera alors automatiquement à en rendre compte.

Dans une autre fenêtre de terminal, tapez une commande qui se trouve dans la liste des commandes que `progress` peut suivre.

Nous allons utiliser `cat`. Les commandes qui s’exécutent trop rapidement ne seront pas enregistrées avec `progress`, nous allons donc lister le contenu d’un très long fichier texte.

cat words.page

Dans la fenêtre du terminal avec `progress`, vous verrez les statistiques de la commande `cat` durant son exécution et jusqu’à son achèvement.

Une fois que `cat` a terminé la liste, la fenêtre de `progress` retourne à son état d’attente.

À chaque fois qu’une des commandes pour lesquelles il peut générer un rapport exécute une opération importante, `progress` va automatiquement la surveiller et en faire un rapport.

C’est plutôt pratique.

100% terminé

Ne vous demandez plus comment se déroule une commande de longue durée et évitez de considérer votre curseur, grâce à `pv` et `progress`.