Sections
Vous êtes ici : Accueil Post Event utilitaire Unix à connaitre : Pipe Viewer

Aller au contenu. | Aller à la navigation

utilitaire Unix à connaitre : Pipe Viewer

Par Michel Le Cocq - Dernière modification Mar 01, 2009 11:13 PM
— Mots-clés associés : , ,

pv utilitaire en ligne de commande pour monitorer la progression de la transmission de données à travers un pipe. Peut être inséré dans n'importe quel système de pipe normal entre deux process. Il permet de donner une indication visuelle sur la vitesse du transfert de données passant au travers de ce pipe, le temps qu'il prendra, une estimation du temps qu'il lui reste avant de se terminer ainsi qu'un pourcentage d'avancement.

Traduction de : A Unix Utility You Should Know About: Pipe Viewer

Peteris Krumins (prononcer Peter-is Kroo-mins) sur son blog présente une série d'articles : "Unix utilities that you should know about" traduite ici en "utilitaires Unix à connaitre". Il s'agit de la présentation d'un utilitaire Unix par un "how to" et une série de mise en situation. Je vais tacher de tenir à jour et de maintenir la traduction de cette liste d'articles. Cette liste recense actuellement deux utilitaires : Pipe Viewer et Netcat.

 

Pipe Viewer ou pv est un utilitaire en ligne de commande pour monitorer la progression de la transmission de données à travers un pipe. Il peut être inséré dans n'importe quel système de pipe normal entre deux process. Il permet de donner une indication visuelle sur la vitesse du transfert de données passant au travers de ce pipe, le temps qu'il prendra, une estimation du temps qu'il lui reste avant de se terminer ainsi qu'un pourcentage d'avancement.

Pipe Viewer est écrit par Andrew Wood un administrateur système Unix expérimenté. Vous trouverez sur son site la page de pv utility.

 

How to pv ?

Je vais vous présenter ici une série d'exemples avec une progression progressive en complexité.

  • Supposons que nous avons un fichier "access.log" de plusieurs gigabytes qui contient les logs d'un serveur web. Nous voulons le compresser pour obtenir un fichier plus petit. Nous pouvons pour cela le compresser en un fichier gunzip (.gz). La façon la plus commune de le faire serait d'utiliser la commande suivante :
    $ gzip -c access.log > access.log.gz
    Le fichier est tellement gros (plusieurs gigabytes) que vous n'avez aucune idée du temps que prendra la manipulation. Est-ce-que ce sera fini après mon café ? Est-ce-que ça prendra plus de 30min ?
    En utilisant pv vous serez précisément le temps que ça prendra. Voici la façon de faire en utilisant pv:
    $ pv access.log | gzip > access.log.gz
    611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59
    Pipe Viewer se comporte ici comme "cat" mis à part qu'il ajoute une barre de progression. Nous voyons ainsi que gzip a traité 611MB de données en 11s. Il a déjà effectué 15% de l'opération et il reste encore 59 secondes avant la fin. Donc pas le temps pour un café.

    On peut insérer autant de process pv que l'on souhaite. Par exemple vous pouvez monitorer la vitesse lecture des données sur le disque et la vitesse de compression des données en sortie.
    $ pv -cN source access.log | gzip | pv -cN gzip > access.log.gz
    source:  760MB 0:00:15 [37.4MB/s] [=>     ] 19% ETA 0:01:02
    gzip: 34.5MB 0:00:15 [1.74MB/s] [ <=> ]
    L'option "-N" passé à pv crée un nouveau flux nommé ici "source". Le paramètre "-c" est souvent à utiliser en conjonction avec les flux, il permet d'être sur que la sortie ne sera pas perturbée par un autre process pv s'écrivant les uns sur les autres.

    Cet exemple montre que "access.log"est lu à 37.4MB/s sur le disque mais gunzip seulement à 1.74MB/s. Nous pouvons ainsi directement calculer le taux de compression qui est de : 37.4/1.74 = 21x !

    Il faut noter que l'on ne connait pas le temps restant avant la fin de la compression. Le process pv placé après le gzip n'a aucune idée de la quantité de données qui sera produite par le gzip, il ne fait qu'afficher le résultat de la compression par rapport au flux d'entrée. Le premier pv lui connait la quantité de données traitées puisqu'il lit les données en entrée.

  • Un autre exemple similaire qui compresse un dossier complet  remplit de ficher en un tarball compressé unique.
    $ tar -czf - . | pv > out.tgz
     117MB 0:00:55 [2.7MB/s] [>         ]
    Dans cet exemple pv montre juste la vitesse de sortie de la commande "tar -czf". Ce n'est pas très intéressant et ne donne pas d'information sur la quantité de données traitées. Il faut passer la quantité de données totale à compresser en argument à pv.
    $ tar -cf - . | pv -s $(du -sb . | awk '{print $1}') | gzip > out.tgz
     253MB 0:00:05 [46.7MB/s] [>     ]  1% ETA 0:04:49
    Ici nous demandons à tar de de créer "-c" une archive de toutes les données présentes dans le répertoire courant "." vers la sortie standard (stdout) "-f -". Ensuite nous spécifions à pv la taille "-s" de tous les fichiers dans le répertoire courant. La commande “du -sb . | awk ‘{print $1}’” renvoie le nombre de bytes présent dans le répertoire courant et sont passé en argument à pv avec l'option "-s". Enfin l'ensemble du contenu est gzip vers un fichier out.tgz. De cette façon pv connait la quantité de données restant à traiter et nous affiches qu'il faudra encore 4min 49s pour terminer.

  •  L'exemple suivant copie une grande quantité de données sur le réseau via l'utilisation de l'utilitaire "nc" qui sera présenté dans une prochaine traduction.

    Nous supposons que nous avons deux ordinateurs A et B. Nous voulons rapidement transférer des données de A vers B. La méthode la plus rapide est d'utiliser tar et nc et de monitorer l'opération avec pv.
    # Sur l'ordinateur A, avec l'adresse IP 192.168.1.100
    $ tar -cf - /chemin/vers/dir | pv | nc -l -p 6666 -q 5
    # Sur l'ordinatur B
    $ nc 192.168.1.100 6666 | pv | tar -xf -
    
    Tous les fichiers dans /chemin/vers/dir sur l'ordinateur A seront transférés à l'ordinateur B, et vous aurez une estimation du temps et de la vitesse du transfert.
    Si en plus vous voulez afficher une barre de progression, il faut utiliser les flux “pv -s $(…)” voir l'exemple précédent (seulement sur l'ordinateur A).

  •  Le dernier exemple vient d'un lecteur du blog de Peteris nommé alexandru.Il nous montre comment afficher la vitesse le lecture depuis /dev/zero.
    $ pv /dev/zero > /dev/null
     157GB 0:00:38 [4,17GB/s]
    


J'espère que ces exemples ont été suffisamment explicites et que vous avez appris quelque chose de nouveau.

 

Comment installer pv ?

  • Si vous êtes sur Debian ou un système basé sur Debian tel que Ubuntu :
    $ sudo aptitude install pv
    
  • Si vous êtes sur Fedora ou système basé sur Fedora tel que CentOS :
    $ sudo yum install pv
    
  • Si vous êtes sur Slackware il faut aller sur la page de pv et télécharger les sources :
    $ tar -zxf pv-version.tar.gz
    $ cd pv-version
    $ ./configure && sudo make install
    
  • Si vous êtes sous FreeBSD :
    $ cd /usr/ports/sysutils/pv
    $ make install clean
  • Si vous êtes sur Mac :
    $ sudo port install pv
  • Si vous êtes sur OpenSolaris :
    $ pfexec pkg install pv
  • Si vous êtes sur Windows avec Cygwin :
    $ ./configure
    $ export DESTDIR=/cygdrive/c/cygwin
    $ make
    $ make install
    


Le man de cet utilitaire se trouve ici : man pv

 

Actions sur le document
Outils personnels