watch ou comment garder un oeil sur une commande (ou la faire tourner à l'infini et...)

Vous en avez marre de surveiller en permanence un même programme ? Assez de lancer n fois de suite la même commande pour voir comment celle-ci évolue ? Alors watch est fait pour vous.

Ce petit programme disponible sous Linux (apparemment disponible également sous Mac OS X via Fink) va exécuter de manière régulière une commande et afficher son résultat (sortie standard) en temps réel et en "plein écran" ou plutôt devrais-je dire en "plein terminal" (comprendre dans toute la hauteur et largeur du terminal ou de la console).

Il est donc possible de suivre l'évolution de résultats pour des commandes non interactives (par exemple ls est une commande non interactive c.a.d. que le résultat s'affiche en une fois et rend la main à la différence de programme comme mtr, htop ou sl :D).

Bref c'est LE programme de surveillance des programmes !

Allons donc voir ses options et jouons tous ensemble avec watch...

-n
Par défaut watch relance à l'infini (sauf interruption de votre part avec CTRL + C) la même commande (ou programme c'est pareil hein) toutes les 2 secondes. Avec l'option "-n" il est possible de spécifier un intervale de temps différent. Le plus bas étant 1 seconde (c'est en général le plus utilisé car nous sommes tous impatients !)

Mettons nous en situation (désolé pour cet article, respect de la planète tout ça : on fera sans image vu que c'est de l'affichage de terminal autant faire ça en mode texte... oui la flemme d'ouvrir The GIMP).
Accessoirement la commande utilisée pour cette démo est la commande date :D peu d'intérêt mais je m'ennuyais ; je voulais voir le temps passer et j'aime pas les horloges kikoolol ! Et donc oui on est le 27 mai 2008 et alors :p ?!

Sinon blague à part on peut faire des choses très utiles avec watch comme surveiller les dernières entrées/modifs d'un répertoire avec "watch ls -lart" ou bien surveiller un firewall avec "watch iptables -nvL".

Mais bon fin de la parenthèse ; les tests ont quand même été réalisés avec date :

 

$ watch -n  1 date

... donne :

Every 1,0s: date                                        Tue May 27 16:18:35 2008

   mar mai 27 16:18:35 CEST 2008

... et donnera 1 seconde plus tard...

Every 1,0s: date Tue May 27 16:18:36 2008

   mar mai 27 16:18:36 CEST 2008

Magique non ? Passons à une autre option...

 -d (ou comment mettre en lumière les différences entre 2 tours)
Ici on met en évidence les changements constatés depuis le dernier tour. Très utile pour voir l'évolution d'un répertoire par exemple avec "watch du -sh *" pour lister l'évolution de la taille des fichiers et répertoires au sein du répertoire courant (oui oui ça fait beaucoup de répertoire dans la même phrase).
Testons quand même avec date :
 

$ watch -n 1 -d date
... donne :
Every 1,0s: date Tue May 27 16:18:35 2008

   mar mai 27 16:18:35 CEST 2008

et donnnera 1 seconde plus tard...

Every 1,0s: date Tue May 27 16:18:36 2008

mar mai 27 16:18:36 CEST 2008

"L'oeil au beurre noir" n'est pas une erreur c'est comme cela que watch met en valeur les choses.

--differences=cumulative (ou comment mettre en lumière tous les changement depuis le début du run)
Comme tout à l'heure mais en différent : cette fois-ci chaque changement est mis en lumière mais cette "lumière" est conservée dans le temps.
Cette fois-ci c'est mysqlshow qui sert de cobaye (ici on compte le nombre de table à un instant t dans une base de données MySQL) :
 
$ watch -n 1 --differences=cumulative 'mysqlshow -u root -proot test --count'

 

Every 1,0s: mysqlshow -u root -proot test... Tue May 27 17:15:10 2008
Database: test
+----------+----------+------------+
|  Tables  | Columns  | Total Rows |
+----------+----------+------------+
| table1   |       11 |          0 |
| table2   |       15 |          0 |
| table3   |        8 |          0 |
| table4   |        7 |          0 |
| table5   |        3 |          0 |
| table6   |       12 |          0 |
+----------+----------+------------+
6 rows in set.



... 1 seconde (et 1 requête) plus tard...

 

Every 1,0s: mysqlshow -u root -proot test... Tue May 27 17:15:11 2008
Database: test
Every 1,0s: mysqlshow -u root -proot test... Tue May 27 17:15:10 2008
Database: test
+----------+----------+------------+
|  Tables  | Columns  | Total Rows |
+----------+----------+------------+
| table1   |       11 |          0 |
| table2   |       15 |          0 |
| table3   |        8 |          0 |
| table4   |        7 |          0 |
| table5   |        3 |          0 |
| table6   |       12 |          1 |
+----------+----------+------------+
6 rows in set.


... 1 seconde (et 1 autre requête) plus tard...

 

Every 1,0s: mysqlshow -u root -proot test... Tue May 27 17:15:10 2008
Database: test
+----------+----------+------------+
|  Tables  | Columns  | Total Rows |
+----------+----------+------------+
| table1   |       11 |          0 |
| table2   |       15 |          0 |
| table3   |        8 |          0 |
| table4   |        8 |          0 |
| table5   |        3 |          0 |
| table6   |       12 |          1 |
+----------+----------+------------+
6 rows in set.



Le premier changement est bien resté "allumé"... pratique pour éviter d'avoir toujours le nez sur le watch (avec "-d" la mise en valeur aurait disparu au tour d'après... la durée d'un tour étant définie rappelons le par "-n").

Encore une fois et pour finir watch doit faire parti de votre couteau suisse d'admin (ou autre :p) donc si vous ne le connaissiez pas encore c'est le moment de l'adopter
... c'est un indispensable !

Écrire un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec une *

Quelle est le cinquième caractère du mot 4ci9vkn ? :