Création d'une barre de progression avec «dialogue» à partir de la sortie rsync

16

Je cherche un moyen de filtrer / rediriger la sortie rsync de manière à ce qu'elle puisse être alimentée par la commande "dialog --gauge", afin que je puisse obtenir une barre de progression agréable lors de la synchronisation des fichiers. Actuellement, je ne l'ai testé que directement à l'invite, mais je prévois de le faire dans un script shell (bash).

J'ai regardé sur Internet et trouvé des morceaux, mais il me manque encore quelque chose pour le faire fonctionner

(Avertissement: cela pourrait être une approche totalement erronée, et c'est une monstruosité de redirection / piping)

Ce que j'ai actuellement rassemblé:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data | awk -f /home/user/rsync.awk | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

J'ai d'abord la commande rsync réelle avec l'option --progress La sortie de rsync est dirigée vers awk et utilise le filtre awk suivant:

{
   if (index($0, "to-check=") > 0)
   {
        split($0, pieces, "to-check=")
        split(pieces[2], term, ")");
        split(term[1], division, "/");
        print (1-(division[1]/division[2]))*100
}
#   else
#   {
#       print "#"$0;
#   }
   fflush();
}

Cela filtre la sortie rsync et fournit le pourcentage au format suivant:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

Donc, pour se débarrasser des nombres décimaux, je fournis la sortie à sed:

sed 's/\([0-9]*\).*/\1/'

Ce qui donne la sortie suivante:

64
66
68
70
72
74
75
77

Ces chiffres sont canalisés dans une boîte de dialogue comme celle-ci:

dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

Pour autant que je sache, "dialog --gauge" etc. devrait accepter cela, mais il affiche simplement la progression à 0% jusqu'à ce qu'elle atteigne soudainement 100%

Quelqu'un peut-il me diriger dans la bonne direction ici? Suis-je loin d'une barre de progression fonctionnelle? Existe-t-il un meilleur moyen d'y parvenir?

Cordialement,

Christer

EDIT : Après avoir pris en compte la réponse de @lynxlynxlynx, la ligne de commande correcte est:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data \ 
 | awk -f /home/user/rsync.awk \ 
 | sed --unbuffered 's/([0-9]*).*/\1/' \ 
 | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
chr1573r
la source
1
On dirait que quelque chose (probablement awk) met en mémoire tampon la sortie jusqu'à ce que le programme avant lui dans le pipeline envoie l'EOF.
Je ne sais

Réponses:

12
for i in 10 20 30; do echo $i; sleep 1; done | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

fonctionne bien, donc @Shadur a raison et il y a un tampon en jeu.

L'ajout du seddécapant dans le mix montre qu'il est le coupable (affiche uniquement 0 et 30):

for i in 10 20 30; do echo $i; sleep 1; done | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

Maintenant que le problème est connu, vous avez plusieurs options. Le plus propre serait d'arrondir / couper le pourcentage awkavec des mathématiques ou une manipulation de chaînes, mais puisque vous avez GNU sed, il suffit d'ajouter -uou de --unbufferedfaire l'affaire.

Cependant, par souci d'exhaustivité, un cas de test simple montre awkégalement la mise en mémoire tampon:

for i in 10 20 30; do echo $i; sleep 1; done | awk '{print $0}' | sed -u 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

Mais vous gérez déjà cela avec fflush, donc je ne m'attends pas à des problèmes.

lynxlynxlynx
la source
Sensationnel..! Mille mercis! Ajouter - non tamponné à sed était la seule chose nécessaire! Merci d'avoir partagé votre temps et vos connaissances Shadur & lynxlynxlynx!
chr1573r
Pour d'autres personnes qui se demandent à quoi ressemble la commande finale: rsync -avz --progress -e "ssh" user @ server: / home / user / data / / home / user / data | awk -f /home/user/rsync.awk | sed - sans tampon 's / ([0-9] *). * / \ 1 /' | dialog --title "My Gauge" --gauge "Salut, c'est un widget de jauge" 20 70
chr1573r
Pas de problème, et bienvenue sur le site. :)
Shadur