Realizzare una barra di avanzamento con "finestra di dialogo" dall'output di rsync


16

Sto cercando un modo per filtrare / reindirizzare l'output di rsync in un modo in cui possa essere inviato al comando "dialog --gauge", così posso ottenere una barra di avanzamento gradevole durante la sincronizzazione dei file. Attualmente l'ho provato solo direttamente al prompt, ma ho intenzione di farlo in uno script di shell (bash).

Mi sono guardato intorno su Internet e ho trovato pezzi, ma mi manca ancora qualcosa per farlo funzionare

(Dichiarazione di non responsabilità: questo potrebbe essere un approccio totalmente sbagliato, ed è una mostruosità di reindirizzamento / connessione)

Quello che ho attualmente messo insieme:

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

Per prima cosa ho l'attuale comando rsync con l'opzione --progress L'output di rsync viene reindirizzato in awk e utilizza il seguente filtro awk:

{
   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();
}

Questo filtra l'output di rsync e fornisce la percentuale nel seguente formato:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

Quindi, per sbarazzarmi dei numeri decimali, invio l'output a sed:

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

Che dà il seguente risultato:

64
66
68
70
72
74
75
77

Quei numeri vengono inseriti in una finestra di dialogo in questo modo:

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

Per quanto ne so, "dialog --gauge" ecc. Dovrebbe accettarlo, ma mostra solo che i progressi sono dello 0% fino a quando non raggiunge improvvisamente il 100%

Qualcuno può indicarmi la giusta direzione qui? Sono lontano da una barra di avanzamento funzionante? C'è un modo migliore per raggiungere questo obiettivo?

Saluti,

Christer

EDIT : dopo aver preso in considerazione la risposta di @lynxlynxlynx, la riga di comando corretta è:

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

1
Sembra che qualcosa (probabilmente awk) stia eseguendo il buffering dell'output fino a quando il programma prima che sia nella pipeline non invii l'EOF. Non so come controllare o affrontare questo, però ...
Shadur

Risposte:


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

funziona bene, quindi @Shadur ha ragione e c'è buffering in gioco.

L'aggiunta dello sedstripper nel mix mostra che è il colpevole (mostra solo 0 e 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

Ora che il problema è noto, hai più opzioni. Il più pulito sarebbe arrotondare / tagliare la percentuale awkcon la matematica o la manipolazione delle stringhe, ma poiché hai GNU sed, aggiungi -uo --unbuffereddovresti fare il trucco.

Tuttavia, per completezza, un semplice caso di prova mostra awkanche il buffering:

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 

Ma lo gestisci già con fflush , quindi non mi aspetto problemi.


Wow..! Grazie mille! L'aggiunta di --unbuffered a sed era l'unica cosa necessaria! Grazie per aver condiviso il tuo tempo e le tue conoscenze Shadur & lynxlynxlynx!
chr1573r,

Per altre persone che si chiedono come appare il comando finale: 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 "Ciao, questo è un widget di gauge" 20 70
chr1573r

Nessun problema e benvenuto nel sito. :)
Shadur,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.