2011-08-23 20 views
15

Próbuję napisać skrypt w języku Python, który monitoruje transfer rsync i zapewnia (przybliżony) szacunek procentowego postępu. Dla mojej pierwszej próbie, spojrzałem na komendzie rsync --progress i zobaczył, że wypisuje komunikaty takie jak:Monitorowanie Rsync Progress

1614 100% 1.54MB/s 0:00:00 (xfer#5, to-check=4/10)

pisałem parser dla takich wiadomości i używane części do-check, aby produkować procentowy postęp, tutaj, to byłoby 60% kompletne.

Jednak istnieją dwa błędy w tym:

  • W dużych transferów, w „licznik” frakcji do check-nie wydaje się monotonicznie maleje, więc kompletność odsetek może skoczyć do tyłu.
  • Taka wiadomość nie jest drukowana dla wszystkich plików, co oznacza, że ​​postęp może przeskoczyć do przodu.

Sprawdziłem inne alternatywy wiadomości do wykorzystania, ale nie udało mi się znaleźć niczego. Czy ktoś ma jakieś pomysły?

Z góry dziękuję!

+3

Wartości przeskakują, ponieważ rsync rozpoczyna przesyłanie danych, podczas gdy wciąż ocenia pracę, którą ma wykonać. Jest to równie dobry środek, jak każdy, który dostaniesz. – hop

+0

Czy nie ma sposobu, aby dokonać wstępnej oceny pracy, którą musi wykonać? --dry-run --stats wydaje się być rzeczą, która to robi, niestety wartości, które produkuje dla danych do przesłania, nie są poprawne. – paulmdavies

+0

dlaczego zwalniałbyś go, żeby pokazywał nieprzydatne informacje? – hop

Odpowiedz

0

Aby uzyskać pełną kontrolę nad transferem, należy użyć narzędzia o niższym poziomie trudności i samodzielnie zarządzać listingiem katalogu i przesyłaniem danych.

podstawie librsync tam jest albo wiersz poleceń rdiff lub moduł python pysync

24

Aktualna wersja rsync (w czasie edycji 3.1.2) ma opcję --info=progress2 który pokaże postęp całego przesłać zamiast pojedynczych plików.

Od the man page:

Istnieje również opcja --info = progress2 że wyprowadza statystyki na podstawie całego transferu, zamiast pojedynczych plików. Użyj tej flagi bez wypisywania nazwy pliku (np. Unikaj -v lub określ --info = nazwa0, jeśli chcesz zobaczyć, jak działa transfer bez przewijania ekranu z wieloma nazwami. (Nie musisz określać - opcja postęp w celu wykorzystania --info = progress2.)

Więc, jeśli to możliwe w systemie można uaktualnić rsync do aktualnej wersji, która zawiera tę opcję.

+0

Bardzo dobrze to słyszeć! Dziękuję Ci! – Avio

+0

Gdybym mógł kompilować tylko rsync na MinGW:/ – msiemens

+0

przyrostowa kopia zapasowa nie pokazuje poprawnego paska postępu – LOKESH

6

można wyłączyć przyrostowe z rekursji Argument --no-inc-recursive. rsync wykona wstępne skanowanie całej struktury katalogów, więc zna całkowitą liczbę plików, które musi sprawdzić. 10 To jest w rzeczywistości stary sposób, w jaki się to powtórzyło. Przyrostowa rekurencja, bieżąca wartość domyślna, została dodana dla prędkości.

4

Uwaga zastrzeżenie tutaj, że nawet --info=progress2 jest nie całkowicie wiarygodne, ponieważ jest to odsetek na podstawie liczby plików rsync wie o w momencie kiedy wyświetlany jest postęp. Nie musi to być całkowita liczba plików, które należy zsynchronizować (na przykład, jeśli wykryje dużą liczbę dużych plików w głęboko zagnieżdżonym katalogu).

Jednym ze sposobów, aby upewnić się, że --info=progress2 nie wrócić we wskazaniu postępu byłoby zmusić rsync skanować wszystkie katalogi rekurencyjnie przed rozpoczęciem synchronizacji (zamiast domyślnego zachowania robi stopniowo rekurencyjnego przeszukiwania), przez podanie opcji --no-inc-recursive. Zauważ jednak, że ta opcja zwiększy również użycie pamięci rsync i czas pracy.

+0

działa to doskonale dla mnie, dzięki za wyjaśnienie opcji –