Jon*_*mar 5 rsync file-transfer
我有大约 50 GB 的空间可以移动。我想通过为局域网优化的 TCP/IP(因此标题中的网络)来完成它。我的问题是连接偶尔会中断,而且我似乎从未将所有数据可靠地发送到目的地。我想要这个东西
我的方法是使用rsync
.
SOURCE=/path/to/music/ # slash excludes "music" dir
DESTINATION=/path/to/destination
rsync \
--archive \ # archive mode; equals -rlptgoD (no -H,-A,-X)
--compress \ # compress file data during the transfer
--progress \ # show progress during transfer
--partial \ # delete any partially transferred files after interrupt, on by default but I added it for kicks
--human-readable \ #output numbers in a human-readable format
"$SOURCE" \
"$DESTINATION" \
Run Code Online (Sandbox Code Playgroud)
还有其他我应该考虑的参数吗?
看来我的rsync
参数没问题。
我必须添加一个参数来处理连接失败后存在的文件。选择是--ignore-existing
或--update
避免重写已经写好的东西。我仍然不确定哪个更好(也许有人知道),但在这种情况下,我在--update
阅读完此内容后选择了https://askubuntu.com/questions/399904/rsync-has-been-interrupted-copy-from-beginning
比较:
通过在退出代码不为零时不断调用 rsync 来解决连接问题难题(不稳定的 wifi 等),从而迫使我的进程继续,直到传输成功。(除非我切断电源,闪电击中我的电源线,或者我使用信号杀死它)
为了处理网络断开连接,我使用了while
循环。
while [ 1 ]
do
# STUFF
done
Run Code Online (Sandbox Code Playgroud)
while [ 1 ]
有一个警告:使用像 ctrl c 这样的信号作为中断 (SIGINT) 将不起作用,除非您对调用break
.
if [ "$?" -gt 128 ] ; then break
Run Code Online (Sandbox Code Playgroud)
然后你可以检查 rsync 的退出代码。零表示所有文件已被移动。
elif [ "$?" -eq 0 ] ; then exit
Run Code Online (Sandbox Code Playgroud)
否则,传输不完整。
else sleep 5
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)