Я пытаюсь передать большой (~3GB) файл между двумя машинами Unix.
Я могу использовать scp или rsync, но иногда передача повреждается. (Я должен проверить вручную.) Я могу разделить файл на части и передать их и затем контрольную сумму и затем повторно объединиться, но это утомительно.
Существует ли единственная команда для корректной передачи большого файла между двумя машинами Unix? Я хочу это к автоматически контрольной сумме обе копии и продолжаю восстанавливать передачу (или части этого), пока это не получает все байты через провод правильно.
Rsync работает путем деления файла на блоки и только передачи блоков, если они отличаются. По его самому характеру это должно смочь обнаружить и зафиксировать повреждение. Вы попытались использовать - частичная опция, которая позволит ему продолжиться, если это будет прервано, и повторное выполнение команды неоднократно, пока это больше не передает данных?
Вы используете rsync сервер на удаленном конце соединения? В противном случае затем Вы на самом деле не используете rsync для передачи файла, он просто использует любой метод базовой передачи, который Вы используете, таким образом, у Вас не будет обнаружения ошибок.
Вы используете лучшие команды, но Ваш компьютер повреждается. Я настоятельно рекомендую выполнить memtest86 + на обеих машинах за ночь для проверки Вас RAM.
Вы всегда могли bittorrent он между хостами, но я не уверен, как автоматизировать его бесцеремонно.
Я часто не делаю такого рода вещи, таким образом, я не написал бы сценарий ее. Вместо этого я создал бы большую остроту, чтобы сделать задание. Таким образом, технически это не одна команда, но это - все на одной строке. Не трудно к сценарию-ify, если Вы часто делаете это.
$ md5sum bigfile > bigfile.md5 ; export BIGFILE="notdone" ; while [ "$BIGFILE" eq "notdone" ] ; do rsync --checksum --partial bigfile* user@remotehost:path/to/put/it/in/ ; ssh user@remotehost "cd path/to/put/it/in/; md5sum -c < bigfile.md5" | grep -Ev 'OK$' | [ `wc -l` == "0" ] && BIGFILE="done" ; done
Это разделяет на:
$ md5sum bigfile > bigfile.md5 ; \ # create our own checksum
export BIGFILE="notdone" ; \ # set our check variable
while [ "$BIGFILE" == "notdone" ]; do \ # recheck variable state after each pass
rsync --checksum --partial bigfile* \ # call rsync to copy
user@remotehost:path/to/put/it/in/ ; \ # and call ssh to check
ssh user@remotehost \ # connect with ssh
"cd path/to/put/it/in/; md5sum -c < bigfile.md5" \ # and run the check
| grep -Ev 'OK$' \ # ignore good output
| [ `wc -l` == "0" ] \ # if we didn't find one
&& BIGFILE="done" ; \ # set our get-out-of-jail card
done \ # and we're done
Необходимо установить SSH для входа в систему в хост с ключевой авторизацией выполнить его без взаимодействия. Если Вы делаете, помещаете оператор эха там, чтобы сказать Вам, где это.
Протестированный, но я ожидаю, что rsync опции можно было настроить.
--checksum
опция вынудить это проверить содержание everyfile вместо того, чтобы брать ярлык принятия файлов с тем же size+timestamp в порядке. – David Spillett 10.10.2009, 14:01