Казалось бы, мои параметры rsync
в порядке.
Мне пришлось добавить параметр для работы с файлами, которые существуют после сбоя подключения. Варианты были --ignore-existing
или --update
, чтобы не переписывать уже написанное. Я до сих пор не уверен, какой из них лучше (возможно, кто-то знает), но в этом случае я выбрал --update
после прочтения этого https://askubuntu.com/questions/399904/rsync -has-been-interrupted-copy-from-beginning
Сравните:
Загадка проблемы с соединением (нестабильный Wi-Fi и т. д.) была решена путем постоянного вызова rsync, когда код выхода не равен нулю, тем самым заставляя мой процесс продолжаться до тех пор, пока передача не будет успешной. (если я не отключу питание, не ударит молния в мои линии электропередач или не отключу его с помощью сигнала)
Для обработки отключений сети я использовал цикл while
.
while [ 1 ]
do
# STUFF
done
в то время как у [ 1 ]
есть предостережение: использование сигнала, такого как ctrl c, для прерывания (SIGINT) не будет работать, если вы не добавите явную проверку для любых кодов выхода выше 128, которые вызывают break
.
if [ "$?" -gt 128 ] ; then break
затем вы можете проверить код выхода rsync. Ноль означает, что все файлы были перемещены.
elif [ "$?" -eq 0 ] ; then exit
В противном случае передача не будет завершена.
else sleep 5
Сценарий rsync предполагает аутентификацию по ключу ssh без пароля.
#!/bin/bash
SOURCE="/path/to/Music/"
DESTINATION="user@computer.local:/media/Music"
while [ 1 ]
do
rsync -e 'ssh -p22'\
--archive \
--compress \
--progress \
--partial \
--update \
--human-readable \
"$SOURCE" \
"$DESTINATION"
if [ "$?" -gt 128 ] ; then
echo "SIGINT detected. Breaking while loop and exiting."
break
elif [ "$?" -eq 0 ] ; then
echo "rsync completed normally"
exit
else
echo "rsync failure. reestablishing connection after 5 seconds"
sleep 5
fi
done