我有大约 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" \
我还应该考虑其他参数吗?
答案1
Rsync 参数
看来我的rsync
参数没问题。
我必须添加一个参数来处理连接失败后存在的文件。选择是--ignore-existing
或--update
避免重写已经写好的东西。我仍然不确定哪个更好(也许有人知道),但在这种情况下,我--update
在读完这篇文章后选择了https://askubuntu.com/questions/399904/rsync-has-been-interrupted-copy-from-beginning
比较:
- --update 跳过接收器上较新的文件
- --ignore-existing 跳过更新接收器上已存在的文件
连接中断
通过在退出代码不为零时不断调用 rsync 来解决连接问题难题(不稳定的 wifi 等),从而迫使我的进程继续,直到传输成功。 (除非我切断电源,闪电击中我的电源线,或者我使用信号杀死它)
为了处理网络断开连接,我使用了while
循环。
while [ 1 ]
do
# STUFF
done
while [ 1 ]
有一个警告:使用像 ctrl c 这样的信号作为中断 (SIGINT) 将不起作用,除非您对调用break
.
if [ "$?" -gt 128 ] ; then break
然后你可以检查 rsync 的退出代码。零表示所有文件已被移动。
elif [ "$?" -eq 0 ] ; then exit
否则,传输不完整。
else sleep 5
脚本示例sync-music.sh
rsync 脚本采用 ssh 无密码密钥身份验证。
#!/bin/bash
SOURCE="/path/to/Music/"
DESTINATION="[email protected]:/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