Я использую команду оболочки scp для копирования огромной папки с файлами.
Но в какой-то момент мне пришлось убить запущенную команду (Ctrl + C или kill).
Насколько я понимаю, scp скопировал файлы последовательно, поэтому должен быть только один частично скопированный файл.
Как можно возобновить ту же команду scp, чтобы не перезаписывать успешно скопированные файлы и правильно обрабатывать частично скопированные файлы?
PS Я знаю, что могу делать такие вещи в rsync, но по какой-то причине scp для меня быстрее, и я использую его вместо этого.
dd
с правильнойskip
переменной и передать по конвейеруssh
:)Typically, rsync is configured to use ssh by default
так что ... он должен быть примерно таким же быстрым (хотя сначала выполняется список каталогов, что может привести к более медленному запуску)Ответы:
Вы должны использовать
rsync
болееssh
rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path
Ключевой вариант
-P
такой же, как--partial --progress
Также можно использовать другие параметры, такие как
-a
(для режима архива) и-z
(для включения сжатия).Руководство: https://download.samba.org/pub/rsync/rsync.html
источник
-r
. Источник: lucasb.eyer.be/snips/rsync-skipping-directory.htmlrsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Альтернатива rsync:
Использование
sftp
с опцией-r
(рекурсивно скопировать целые каталоги) и опцию-a
изsftp
«Sget
команды„возобновить частичную передачу существующих файлов.“Предпосылка: в вашей
sftp
реализации уже есть опцияget
with-a
.Пример:
Скопируйте каталог
/foo/bar
с удаленного сервера в ваш локальный текущий каталог. Каталогbar
будет создан в вашем локальном текущем каталоге.echo "get -a /foo/bar" | sftp -r user@remote_server
источник
echo "put -a foo/bar" | sftp -r server:/foo
Начиная с OpenSSH 6.3, вы можете использовать
reget
команду вsftp
.Он имеет тот же синтаксис
get
, что и у него, за исключением того, что он начинает передачу с конца существующего локального файла.echo "reget /file/path" | sftp -r user@server_name
Тот же эффект имеет
-a
переключение наget
команду или глобальный-a
переключатель командной строки sftp .источник
Другая возможность - попытаться спасти уже запущенный scp, когда он зависает.
ctrl + z в фоновый режим и остановите его, затем перейдите по ssh на принимающий сервер и войдите в систему, затем выйдите. Теперь запустите процесс scp и посмотрите, как он возобновляется из состояния "остановлен"!
источник
Когда rsync также останавливается через пару секунд при первоначальной работе, я получил следующее решение грубой силы для запуска и остановки повторного запуска загрузки каждые 60 секунд:
cat run_me.sh #!/bin/bash while [ 1 ] do rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz & TASK_PID=$! sleep 60 kill $TASK_PID sleep 2 done
источник
Вы можете использовать опции
-rsh
и . предназначен для частичной загрузки и указывает на то, что передача завершена через ssh procotol.-P
rsync
-P
-rsh
Полная команда будет такой:
rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
источник
Вчера у меня была такая же проблема, при передаче огромного дампа sql через scp, мне повезло с
wget --continue the_url
Это сообщение в блоге довольно хорошо объясняет http://www.cyberciti.biz/tips/wget-resume-broken-download.html в основном:
wget --continue url
источник