Jak naprawić uszkodzony pakiet dla rsync dla (względnie) dużych plików?

10

Próba aktualizacji plików na serwerze za pomocą rsyncpolecenia:

rsync -ravq -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

corrupt packet błędy są ciągle zgłaszane, w szczególności:

rsync: writefd_unbuffered failed to write 4092 bytes to socket [sender]: Broken pipe (32)
rsync: connection unexpectedly closed (11337 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /home/lapo/package/rsync-3.0.9-1/src/rsync-3.0.9/io.c(605) [sender=3.0.9]

Jest to prawdopodobnie związane z sshprzekroczeniem limitu czasu, ponieważ wydaje się, że dzieje się tak w przypadku dużych plików (r). Ponadto ciągle otrzymuję limity czasu za pomocą WinSCP. To dzieje się tylko ze mną; kilka osób, z którymi pracuję, korzysta z tego serwera, nie ma tego samego problemu.

Korzystanie rsyncz terminala Cygwin w systemie Windows 7 na serwerze Centos 6.3.

Nie jestem pewien, jakie inne informacje mogą być przydatne lub jak je uzyskać. Zaktualizuję pytanie lub dodam komentarze zgodnie z wszelkimi sugestiami.

Jak mam to rozwiązać?

Dziękuję bardzo!

Juan Carlos Coto
źródło

Odpowiedzi:

12

Nie jestem pewien, co może powodować corrupt packetproblem, który powoduje zerwanie połączenia, ale może się okazać, że rsync --partiallub --partial-diropcja jest pomocna podczas przesyłania dużych plików, więc po ponownym uruchomieniu przesyłania będzie on kontynuowany w miejscu, w którym przesyłanie zostało przerwane, zamiast konieczności ponownego przesyłania cały plik ponownie:

--partial-dir = .rsync-częściowy

Aby zmodyfikować oryginalne polecenie, wykonaj następujące czynności:

rsync -rav --progress --partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

lub

rsync -rav --progress --partial-dir=.rsync-partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

Zauważ, że dla tego przykładu usunąłem opcję -q( --quiet) i dodałem --progressopcję w pierwszym przykładzie i --partial-dir=.rsync-partialdrugim przykładzie.

Różnica między --partiali --partial-dir=.rsync-partialpolega na tym, że później tworzy katalog, w którym pliki częściowe są oddzielone od plików w pełni przesłanych, jeśli jest to ważne dla Ciebie po stronie odbierającej (serwera).

Strona podręcznika rsync wyjaśni to bardziej szczegółowo, ale wskażę też ważną notatkę bezpieczeństwa z tej strony:

WAŻNE: katalog --partial-dir nie powinien być zapisywany przez innych użytkowników lub stanowi zagrożenie bezpieczeństwa. NALEŻY UNIKAĆ „/ tmp”.

aculich
źródło
Wypróbowałem obie opcje i żadna nie rozwiązała problemu. Dzięki za podpowiedź.
Juan Carlos Coto
1

Zniszczenie sugeruje zły NIC lub sterownik NIC w twoim komputerze; Miałem to raz na oknie Windows mojej żony: musiałem wielokrotnie próbować zainstalować rsync. Gdy to się powiedzie, mogę wielokrotnie wywoływać rsync, aby przesłać i naprawić inne potrzebne oprogramowanie, które w szczególności zawiera zaktualizowane sterowniki karty sieciowej i narzędzie sumy kontrolnej.

Phil P.
źródło
0

Jeśli wartością ulimit jest 0 lub mała liczba, powinien podawać ten błąd. Spróbuj zwiększyć wartość ulimit (such as 9999999999)i spróbuj ponownie. możesz napisać mały skrypt powłoki (a.sh)i użyć czegoś takiego:

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/
COA
źródło
2
To interesujące. Od dłuższego czasu nad tym nie pracuję; jeśli jednak chcesz wyjaśnić, dlaczego to działa, myślę, że przydałoby się każdemu, kto przeczyta to pytanie. Dzięki!
Juan Carlos Coto,
-1

po prostu zapętlaj, aż w końcu zostanie przesłany

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ [email protected]:/dest/; do sleep 5;done
zestaw narzędzi
źródło