Rsync 参数

Rsync 参数

我有大约 50 GB 的空间想要移动。我想通过针对局域网优化的 TCP/IP(因此标题中的网络)来完成此操作。我的问题是连接偶尔会中断,而且我似乎从未将所有数据可靠地发送到目的地。我想要这个东西

  1. 不那么容易放弃
  2. 继续自动重试(假设两台机器都已通电)。

我的方法是使用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

相关内容