GNU/Linux >> Linux Esercitazione >  >> Linux

Mostrare il progresso totale in rsync:è possibile?

Soluzione 1:

Ora esiste un modo ufficiale per farlo in rsync (versione 3.1.0 protocollo versione 31, testato con Ubuntu Trusty 14.04).

#> ./rsync -a --info=progress2 /usr .
    305,002,533  80%   65.69MB/s    0:00:01  xfr#1653, ir-chk=1593/3594)

Ho provato con il mio /usr folder perché volevo questa funzionalità per il trasferimento di interi filesystem e /usr sembrava essere un buon campione rappresentativo.

Il --info=progress2 fornisce una buona percentuale complessiva, anche se è solo un valore parziale. Infatti, il mio /usr cartella è più di 6 concerti:

#> du -sh /usr
6,6G    /usr/

e rsync ci è voluto molto tempo per scansionare tutto. Quindi quasi sempre la percentuale che ho visto è stata completata per circa il 90%, ma è comunque confortante vedere che qualcosa viene copiato :)

Riferimenti:

  • https://stackoverflow.com/a/7272339/1396334
  • https://download.samba.org/pub/rsync/NEWS#3.1.0

Soluzione 2:

Quanto segue si applica a rsync versione 3.0.0 e successive. Le opzioni descritte di seguito sono state introdotte in quella versione il 1° marzo 2008.

Insieme a --info=progress2 puoi anche usare --no-inc-recursive opzione (o la sua più breve --no-i-r alias) per disabilitare la ricorsione incrementale.

Questo creerà l'intero elenco di file all'inizio, invece di scoprire in modo incrementale più file man mano che il trasferimento procede. Poiché conoscerà tutti i file prima di iniziare, fornirà un rapporto migliore sull'avanzamento complessivo. Questo si applica al numero di file:non riporta alcun progresso in base alle dimensioni dei file.

Ciò comporta un compromesso. Costruire l'intero elenco di file in anticipo è più dispendioso in termini di memoria e può ritardare notevolmente l'inizio del trasferimento effettivo. Come ti aspetteresti, più file ci sono, più lungo sarà il ritardo e più memoria richiederà.

Quanto segue è tratto dal manuale di rsync (fonte - http://rsync.samba.org/ftp/rsync/rsync.html ):

-r, --recursive

Questo dice a rsync di copiare le directory in modo ricorsivo. Vedi anche --dirs (-d). A partire da rsync 3.0.0, l'algoritmo ricorsivo utilizzato è ora una scansione incrementale che utilizza molta meno memoria rispetto a prima e inizia il trasferimento dopo che è stata completata la scansione delle prime directory. Questa scansione incrementale influisce solo sul nostro algoritmo di ricorsione e non modifica un trasferimento non ricorsivo. È anche possibile solo quando entrambe le estremità del trasferimento sono almeno alla versione 3.0.0.

Alcune opzioni richiedono che rsync conosca l'elenco completo dei file, quindi queste opzioni disabilitano la modalità di ricorsione incrementale. Questi includono:--delete-before, --delete-after, --prune-empty-dirs e --delay-updates. Per questo motivo, la modalità di eliminazione predefinita quando specifichi --delete ora è --delete-during quando entrambe le estremità della connessione sono almeno 3.0.0 (usa --del o --delete-during per richiedere questa modalità di eliminazione migliorata esplicitamente). Vedi anche l'opzione --delete-delay che è una scelta migliore rispetto all'utilizzo di --delete-after.

La ricorsione incrementale può essere disabilitata usando --no-inc-recursive opzione o la sua più breve --no-i-r alias.

Vedi anche https://rsync.samba.org per specifiche differenze di versione (scorri verso il basso e dai un'occhiata ai link Release News).

Soluzione 3:

Puoi farlo con 'pv' (apt-get install pv con Debian e Ubuntu). Consiglio di monitorare il numero di file trasferiti, poiché la quantità di dati trasferiti non è correlata alla dimensione dei file ma al delta tra origine e destinazione. E il conteggio dei file conterà lo stesso progresso per un grande delta e un altro con un piccolo delta. Il che significa che in ogni caso la stima dell'ETA potrebbe essere lontana. L'ETA basato sulla dimensione funziona solo se la tua destinazione è vuota, in questo caso delta ==dimensione della sorgente.

L'idea generale è di emettere una riga per file 'trasferito' da rsync e contare quelle righe con 'pv':

rsync -ai /source remote:/dest | pv -les [number of files] >/dev/null

Tendo a fare il backup di interi filesystem (per diversi motivi), in questo caso puoi usare il molto più economico df per ottenere il numero di file (anziché du o find che attraverserà la tua gerarchia di origine un'altra volta dopo che rsync lo ha fatto). L'opzione -x sembra assicurarsi che rsync rimanga sullo stesso filesystem di origine (e non segua altri montaggi interni):

rsync -aix /source remote:/dest | pv -les $(df -i /source | perl -ane 'print $F[2] if $F[5] =~ m:^/:') >/dev/null

Se vuoi contare i file in /source in modo generale, usa find /source|wc -l (di nuovo attenzione:potrebbe essere lento e pesante su I/O).

Soluzione 4:

Danakim ha ragione. Non ci sono modi banali per aggiungere un indicatore di progresso totale.

La ragione di ciò è che quando rsync esamina un elenco di file da sincronizzare, non sa in anticipo quali file dovranno essere modificati. Se stai effettuando trasferimenti delta, i delta stessi devono essere calcolati in anticipo per fornire un quadro completo del lavoro che deve essere svolto.

In altre parole, il modo più semplice per calcolare quanto lavoro c'è da fare è farlo effettivamente.

Soluzione 5:

Per i trasferimenti lunghi, sono contento di eseguire du -s su entrambi i lati. Anche watch -n1 du -s , se mi sento davvero ansioso.

watch esegue un comando (du -s qui) periodicamente (ogni secondo qui) e mostra l'output a schermo intero.


Linux
  1. Trasferimenti di file più intelligenti rispetto a Rsync??

  2. Cambiare l'ambiente di un processo in esecuzione?

  3. È possibile emulare versioni precedenti di Bash?

  4. Come controllare lo stato di avanzamento dell'esecuzione di Cp?

  5. Come pianificare un comando Rsync?

Linux Mint KDE è ancora possibile

Rsync Mostra la barra di avanzamento durante la copia di file in Linux

È possibile utilizzare / in un nome file?

rsync N file più recenti in una directory

Gzip compatibile con Rsync

È possibile eseguire il ping di un indirizzo:porta?