Назад | Перейти на главную страницу

Как исправить ошибку поврежденного пакета с помощью rsync для (относительно) больших файлов?

Попытка обновить файлы на сервере с rsync команда:

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

corrupt packet ошибки продолжают возникать, в частности:

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]

Вероятно, это связано с ssh тайм-аут, как это бывает с большими (r) файлами. Кроме того, я продолжаю получать таймауты при использовании WinSCP. Это происходит только со мной; Некоторые люди, с которыми я работаю, используют этот сервер, не имеют такой проблемы.

С помощью rsync с терминала Cygwin в Windows 7 против сервера Centos 6.3.

Я не уверен, какая еще информация может быть полезна и как ее получить. Я обновлю вопрос или добавлю комментарии по любым предложениям.

Как мне это решить?

Огромное спасибо!

Я не уверен, что может вызвать corrupt packet проблема, которая разрывает ваше соединение, но вы можете найти rsync's --partial или --partial-dir Эта опция полезна при передаче больших файлов, чтобы при перезапуске передачи она продолжалась с того места, где была остановлена ​​передача, вместо того, чтобы снова начинать передачу всего файла заново:

--partial-dir = .rsync-partial

Таким образом, вы можете изменить исходную команду следующим образом:

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

или

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

Обратите внимание, что в этом примере я удалил -q (--quiet) и добавил --progress вариант в первом примере и --partial-dir=.rsync-partial во втором примере.

Разница между --partial и --partial-dir=.rsync-partial заключается в том, что последний создает каталог, в котором частичные файлы хранятся отдельно от полностью переданных файлов, если это важно для вас на принимающей (серверной) стороне.

В справочная страница rsync объясню это более подробно, хотя я также отмечу важный записка о безопасности из справочной страницы:

ВАЖНО: --partial-dir не должен быть доступен для записи другим пользователям, иначе это представляет угрозу безопасности. Например. ИЗБЕГАЙТЕ "/ tmp".

Повреждение предполагает наличие на вашем компьютере плохого сетевого адаптера или драйвера сетевого адаптера; однажды было такое на коробке Windows моей жены: приходилось неоднократно пытаться установить rsync. Как только это удастся, я смогу неоднократно вызывать rsync для передачи и исправления другого необходимого программного обеспечения, в том числе обновленных драйверов сетевого адаптера и инструмента контрольной суммы.

Если значение ulimit равно 0 или небольшому числу, оно должно выдавать эту ошибку. Попробуйте увеличить значение ulimit (such as 9999999999) и попробуй еще раз. вы можете написать небольшой сценарий оболочки (a.sh) и используйте что-то вроде этого:

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/

просто зацикливайтесь, пока он не перейдет наконец

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done