Vraag Toont de totale voortgang in rsync: is dit mogelijk?


Ik heb al naar deze optie gezocht, maar heb alleen oplossingen gevonden die hiermee gepaard gaan aangepaste patches. Het feit dat het niet wordt weergegeven in --help en er is geen informatie meer te vinden, geeft waarschijnlijk aan dat de antwoorden 'nee' zijn, maar ik zou graag zien dat dit wordt bevestigd.

Is het mogelijk om te laten zien totale voortgang van de bestandsoverdracht met rsync?


195
2018-01-05 15:26


oorsprong


Sinds rsync 3.1.0 is er nu een algemene voortgang van de bestandsoverdracht inbegrepen. Zie antwoord serverfault.com/a/441724/107793 voor details. - Florian Feldhaus
Wijzig alstublieft het geaccepteerde antwoord. @ David's antwoord is volkomen nutteloos. - Navin


antwoorden:


danakim heeft gelijk. Er zijn geen triviale manieren om een ​​totale voortgangsindicator toe te voegen.

De reden hiervoor is dat wanneer rsync naar een lijst met te synchroniseren bestanden kijkt, het niet van tevoren weet welke bestanden moeten worden gewijzigd. Als u delta-transfers uitvoert, moeten de delta's zelf van tevoren worden berekend om een ​​totaalbeeld te krijgen van het werk dat moet worden gedaan.

Met andere woorden, de eenvoudigste manier om te berekenen hoeveel werk er moet worden gedaan, is door het daadwerkelijk te doen.


33
2018-01-06 04:10



U zou nog steeds een eenvoudige indicator kunnen hebben zoals (gegevens overgedragen + gegevens overgeslagen) / (totale gegevens in bron), of (# bestanden overgebracht of overgeslagen) / (# bestanden in bron). Het gaat niet bijzonder nauwkeurig zijn, maar het zou een idee geven. Goed voor als je aan het eind van de dag een grote overdracht doet en je je afvraagt ​​of je moet wachten en de computer wilt uitschakelen, of het wilt laten rennen voor de nacht ... - naught101
Ik geloof niet dat die conclusie klopt. Ik denk dat @ naught101 eerlijker is voor de vraag, en ik denk dat ik een antwoord predik voor het niet gebruiken --size-only of dergelijke is verder onnauwkeurig. - Evan Carroll
Op het moment dat ik het antwoord schreef, was het juist - rsync had geen mechanisme voor een totale voortgangsindicator. En ja, je zou je eigen kunnen schrijven, maar heel weinig mensen zouden dat doen. - David Mackintosh
Reactie voor nieuwkomers: het is nu mogelijk: serverfault.com/a/441724/422003 - imposeren


Er is nu een officiële manier om dit in rsync te doen (versie 3.1.0 protocolversie 31, Getest met 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)

Ik heb het geprobeerd met mijn /usr map omdat ik deze functie wilde gebruiken voor het overzetten van hele bestandssystemen, en /usr leek een goede representatieve steekproef te zijn.

De --info=progress2 geeft een mooi algemeen percentage, zelfs als het slechts een gedeeltelijke waarde is. In feite, mijn /usr map is meer dan 6 optredens:

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

en rsync nam veel tijd om alles te scannen. Dus bijna altijd was het percentage dat ik heb gezien voor ongeveer 90% voltooid, maar het is toch geruststellend om te zien dat er iets wordt gekopieerd :)

Referenties:


312
2017-10-24 11:13



Merk op dat dit is geland in 3.1.0. Het is ook belangrijk om op te merken dat dit niet noodzakelijkerwijs accuraat is in het tijdsperspectief. Het toont in feite de hoeveelheid gegevens waarvan is vastgesteld dat ze bestaan ​​aan de andere kant. En de snelheid is de snelheid waarmee de gegevens worden geleerd om correct te zijn aan de externe kant (of dat al zo was of de nieuwe gegevens werden overgedragen en correct gemaakt). Dus hoewel erg handig, moet je de restricties begrijpen. - Kevin Cox
Om dit op OSX te gebruiken met homebrew, "brew tap homebrew / dupes; brew rsync installeren" - Matt Carrier
Vermeldenswaardig dat --info=progress2 werkt niet met -v - sanmai
Voeg de toe --no-i-r wissel ook, dus rsync wordt niet incrementeel gescand maar volledig vóór het kopiëren en weet + geeft aan hoeveel werk nog over is. - Alex
Merk op dat je kunt gebruiken --human-readable (of -h) om de totale grootte in MB / GB ... in uitvoering te zien. - Nux


U kunt met 'pv' (apt-get install pv met Debian en ubuntu). Ik raad aan om het aantal overgedragen bestanden te bewaken, omdat de hoeveelheid overgedragen gegevens niet is gecorreleerd aan de grootte van bestanden maar aan de delta tussen de bron en de bestemming. En tellen bestanden tellen dezelfde vooruitgang voor een grote delta en een andere met kleine delta. Dat betekent dat de ETA-schatting in elk geval veraf zou kunnen zijn. De op grootte gebaseerde ETA werkt alleen als uw bestemming leeg is, in dit geval delta == bronformaat.

Het algemene idee is om één regel per bestand 'overgebracht' vanuit rsync uit te zenden, en die lijnen te tellen met 'pv':

rsync -ai / source remote: / dest | pv -les [aantal bestanden]> / dev / null

Ik heb de neiging om hele bestandssystemen te back-uppen (om verschillende redenen), in dit geval kun je het veel goedkopere gebruiken df om het aantal bestanden te krijgen (in plaats van du of find welke je bronhiërarchie doorkruist een andere keer nadat rsync dit deed). De optie -x lijkt ervoor te zorgen dat rsync op hetzelfde bronbestandssysteem blijft (en niet volgt op andere inner mounts):

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

Als u bestanden in / bron op een algemene manier wilt tellen, gebruikt u find /source|wc -l (opnieuw waarschuwen: kan traag en zwaar zijn op I / O).


42
2018-06-10 10:22



Gebruik, als zerodeuz is opgegeven, "df" alleen als u de hele partitie rsync, zoals df -i /source krijgt het aantal inodes (bestanden) van alle partities waarin / de bron zich bevindt. Anders gebruiken 'vinden' om bestanden in een map te tellen in de expressie "$ ()". - lepe
Een alternatief voor du of find - laten we zeggen dat u een onvolledige kopie voltooit of een interne update uitvoert met verwijderingen - is om te gebruiken rsync -ai --dry-run om dezelfde bestandslijst te krijgen waar de hoofdloop naartoe gaat pv - Izkata


Voor lange transfers ben ik blij met hardlopen du -s aan beide kanten. Zelfs watch -n1 du -s, als ik me echt angstig voel.

watch voert een commando uit (du -s hier) periodiek (elke 1 seconde hier) en toont de uitvoer op volledig scherm.


28
2018-01-05 16:30



Bedankt voor het voorbeeld van de watch commando! - Cam
//, slim! Volgens linfo.org: "De opdracht du (dat wil zeggen schijfgebruik) rapporteert de groottes van directory-bomen inclusief al hun inhoud en de grootte van individuele bestanden. Dit maakt het nuttig om space hogs, dwz mappen en bestanden op te sporen die grote of overmatige hoeveelheden ruimte op een harde schijf (HDD) of andere opslagmedia verbruiken. " - Nathan Basanese
Ik weet niet wat voor soort lange transfers je doet, waar du levensvatbaar is. du is slow as hell wanneer het resultaat zal zijn in TB en M van bestanden. - Nobody
Voor mijn 'lange overdrachten' duurt het ongeveer een uur voordat een bewerking is voltooid, waarbij rsync veel langzamer draait, omdat ze vechten om toegang tot de schijf. - Abhi Beckert


Samen met --info = Progress2 Je kan ook incrementele recursie uitschakelen. Dit zal de volledige bestandslijst aan het begin opbouwen en zo je een beter idee geven van de algehele voortgang (tenminste in aantal bestanden, ik denk niet dat het de bestandsgrootte scant). Er is een compromis. Dit kost meer geheugen en vertraagt ​​het begin van de feitelijke overdracht. Waarschijnlijk het best gebruikt in langzamere verbindingen, en zeker niet erg geschikt voor grote hoeveelheden bestanden.

Het volgende is van rsync man pagina onder het detail voor -r - recursief

Incrementele recursie kan worden uitgeschakeld met behulp van de --no-inc-recursieve optie of korter --no-i-r alias.

(bron: http://rsync.samba.org/ftp/rsync/rsync.html )

Ook als u --delete - opgeeft voordat het de volledige recursie aan het begin zal afdwingen, wat het nodig heeft om verweesde bestanden te verwijderen (bestanden die in de dest bestaan, maar niet in de bron).


20
2017-10-16 19:56



Bedankt voor dit, de andere antwoorden resulteren in een% leeftijd die steeds op en neer gaat! - artfulrobot


In principe niet. Je kunt alleen de voortgang per bestand weergeven met de vlag - progress, maar dat is het zo'n beetje.

Ik gok dat je er een wrapper omheen kunt schrijven of een van de patches kunt gebruiken die je al hebt gevonden, maar je moet jezelf afvragen of het echt de moeite waard is, heb je eigenlijk een totale vooruitgang nodig voor rsync?


11
2018-01-05 15:50



Hier is een wrapper-script dat de totale voortgang en voortgang van het bestand toont als een mooie voortgangsbalk: gist.github.com/JohannesBuchner/4d61eb5a42aeaad6ce90 - j13r
Je kunt de manier veranderen --progress werk met --info=progress2, het zal je de globale vooruitgang laten zien. U moet het incrementele recursieve algoritme uitschakelen om bruikbaar te zijn, dus --info=progress2 --no-inc-recursive - mat
@ j13r je kunt deze essentie ook als een antwoord delen! het is een geweldige optie! - skywinder


Ik heb ook gezocht naar hoe de totale voortgang met rsync kan worden weergegeven en ik heb een bruikbare answser gevonden in dit bericht: https://stackoverflow.com/questions/7157973/monitoring-rsync-progress

In principe kunt u gebruiken --info = Progress2 in de dev-versie van rsync 3.1.0. Hier is wat de dokter heeft gezegd:

Er is ook een optie --info = progress2 die statistieken uitvoert op basis van de gehele overdracht in plaats van afzonderlijke bestanden. Gebruik deze vlag zonder een bestandsnaam uit te voeren (bijv. Vermijd -v of specificeer --info = naam0 als u wilt zien hoe het overzetten gebeurt zonder over het scherm te scrollen met veel namen. (U hoeft de voortgangsoptie om --info = progress2 te gebruiken.)


7
2017-07-04 14:30



--info=name0 is goud - ipatch


Ik gebruikte het antwoord van zerodeux en schreef mijn eigen bash-script:

#!/bin/bash

RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"

echo "Executing dry-run to see how many files must be transferred..."
TODO=$(${RSYNC} --dry-run ${RSYNC_ARGS} ${SOURCES} ${TARGET}|grep "^Number of files transferred"|awk '{print $5}')

${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"

7
2018-02-07 23:44





Ik gebruikte het antwoord van zerodeux en schreef mijn eigen kleine BASH-script:

#!/bin/bash

RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"

#echo "Executing dry-run to see how many files must be transferred..."
TODO=$(find ${SOURCES} | wc -l)

${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"

Ik heb de TODO-droogloop gewijzigd in

TODO=$(find ${SOURCES} | wc -l)

Het vindt het aantal bestanden erg snel!


6
2018-01-03 12:00



vind werken zo veel beter dan rsync --dry-run! - hopeseekr
find werkt alleen als je dat bent rsync-ing lokaal. rsync --dry-run werkt ook met externe bronnen ... - voretaq7