[gull] Progress pour cp

Daniel Cordey dc at mjt.ch
Fri Sep 30 16:16:35 CEST 2011


On Fri, 30 Sep 2011 14:23:24 +0200 - Christophe Pochon

> Mais comme je suis perfectionniste, j'ai voulu modifier mon script
> pour qu'il donne un feedback un peu plus parlant aux utilisateurs. Je
> voudrais mettre pour chaque groupe de copie de fichiers, puis pour la
> génération du zip, une sorte de "progress bar", en fait, avec juste
> des petits "." qui s'alignent côte à côte, pour que l'utilisateur se
> rende compte que mon script est bien en train de travailler, qu'il
> n'a pas planté. Ma foi, si ça copie un fichier de 4GB, ben y aura
> quand même qu'un petit point, mais c'est mieux que rien. Donc l'idée
> s'était de récupérer la sortie "verbeuse" de la commande "cp", et
> transformer chaque ligne de ladite sortie en un petit point. En
> faisant :
> 
> ...

La solution proposee par Cyril est correcte car elle n'affiche un point
que si le fichier est entre en mode "transfert". Mais comme tu le dis,
la frequence d'apparion des '.' depend de la taille des fichiers... Il
y a une autre approche qui ressemble au "sablier" ou autres trucs qui
tourne pendant qu'une operation s'effectue. CAD que l'on genere les
points en fonction du temps, et non en fonction de la fragmentation des
donnees transferees. Schematiquement, cela fonctionne comme suit :

On cree une "fonction" qui boucle de maniere infinie en imprimant un
'.' toutes les n secondes (paramare passe a la fonction).

Le programme s'execute, lance la fonction en background (...&) et
recupere le PID du nouveau process... Le reste du pogramme continue a
s'executer et les fichiers sont transferes de maniere silencieuse... A
la fin de la copie, il suffit de tuer le process qui a ete lance en
background (kill) :-)

Ceci a aussi l'avantage de pouvoir implementer une notion de timeout
afin de tuer le process pere en cas d'attente trop longue (ou autre
raison technique); mais ca c'est une autre afaire :-)

Donc, grosso modo (a la volee) :

function point
{
    sleep $1
    echo -n '.'
}

{
point 2 
}&

bproc=$!

for i in files*
do
    cp ${i} ...
done

kill ${bproc}

Et voila...


dc


More information about the gull mailing list