[#!/fr] fournir des données à sqlite3 via despipes

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Patrick Proniewski
Date:  
À: La liste francophone des scripts shell
Sujet: [#!/fr] fournir des données à sqlite3 via despipes
Bonjour,

Je me pose une question pour un script de monitoring que je suis en train de réaliser.
Mac OS X n'a pas, à ma connaissance, de compteur d'I/O qu'on pourrait interroger pour savoir combien un device a reçu d'I/O depuis le boot par exemple. Je cherche à monitorer les I/O sur une baie raid vue comme disk0.

J'en suis donc réduit à utiliser la commande iostat -d -w 10 disk0 pour générer ce genre de chose :

          disk0 
    KB/t tps  MB/s 
    4.02 2318  9.09 
    4.00 1237  4.83 
    6.63 979  6.34 
   46.30  15  0.69 
   30.58  23  0.69 
   12.90  32  0.41 
  107.85  55  5.75 


Je pipe ensuite dans awk pour filtrage et formatage en requête SQLite :

iostat -d -w 10 disk0 |\
awk '!/[a-zA-Z]/ {print "INSERT INTO io VALUES(datetime(\"now\",\"localtime\"),"$1","$2","$3");"}' |\
sqlite3 iostat.db

Malheureusement, ce n'est pas aussi simple, car la DB ne se remplie pas, et ça ne fonctionne pas du tout. Il semble que l'enchainement de pipes impose de terminer la commande en amont pour que quelque chose parvienne à sqlite.
Si par exemple je fais ça (notez le "iostat -c 2") :

iostat -c 2 -d -w 10 disk0 |\
awk '!/[a-zA-Z]/ {print "INSERT INTO io VALUES(datetime(\"now\",\"localtime\"),"$1","$2","$3");"}' |\
sqlite3 iostat.db

J'ai bien 2 lignes dans ma DB sqlite. De plus, par malchance, la première mesure renvoyée par iostat est un artefact (elle n'a pas de valeur réelle), il faut la supprimer. j'ai décidé d'introduire un tail pour récupérer uniquement la dernière valeur :

iostat -c 2 -d -w 10 disk0 | tail -1 |
awk '!/[a-zA-Z]/ {print "INSERT INTO io VALUES(datetime(\"now\",\"localtime\"),"$1","$2","$3");"}' |\
sqlite3 iostat.db

Donc pour finir, mon script est une infâme boucle infinie :

while true; do
iostat -c 2 -d -w 10 disk0 |\
awk '!/[a-zA-Z]/ {print "INSERT INTO io VALUES(datetime(\"now\",\"localtime\"),"$1","$2","$3");"}' |\
sqlite3 iostat.db
done


Avez-vous des suggestions ? Quelque chose de plus élégant ?

patpro_______________________________________________
archives :
http://listes.patpro.net/list/sshfr.fr.html
http://listes.patpro.net/mailman/listinfo/script_shell_fr