私は200TBの大容量伝送にrsyncを使用しています。インターネット上で見つけたシェルスクリプトを使用していくつかのプロセスを作成しましたが、関連するrsyncコマンド自体は次のようになります。
rsync --recursive \
--whole-file \
--inplace \
--sparse \
--no-compress \
--max-alloc=8GiB \
--size-only \
--human-readable \
--info=progress2 \
--log-file="$rsync_file_basename.log" \
--log-file-format="%o=%-7'''b | total=%-7'''l [%i] => %f%L" \
"/mnt/disk${disk_id}/$share_name/$share_subdir/" \
"$target_path" \
>> "$rsync_file_basename.out"
転送はうまくいっていますが、ログを見ると断続的に発生する2つのエラーが見られます。
主に次のようになります。
rsync:[受信機] '/mnt/remotes/TS140_stuff/pictures/family_1/IMG345.jpg'でftruncateが失敗しました。リソースを一時的に使用できません(11)
ただし、次の一部も含まれます。
rsync: [receiver] '/mnt/remotes/TS140_stuff/shows/ep1.mp4'への書き込みに失敗しました:リソースが一時的に利用できない(11)rsyncエラー:Receiver.c(380)のファイルIO(コード11)エラーが発生しました。 [受信機 =3.2.7] rsync: [sender] 書き込みエラー: 破損したパイプ(32) rsync エラー: io.c(1700) のファイル IO (コード 11) エラー [sender=3.2.7]
これで、ターゲットディレクトリはデータが多いSMBマウントなので、同様のことが起こると予想しました。
ところで、このように書く理由は、ターゲットにあるファイルを見ることができ、大丈夫に見えるからです。 rsyncには、コマンドの使用方法に応じて何らかの再試行ロジックがありますか?
答え1
rsync
実際の再試行はありません。しかし、ループでラップするのを防ぐ方法はありません。
#!/bin/sh
k=1 ss=1
while [ "$k" -le 5 ]
do
echo "Attempt $k" >&2
rsync -rt ... &&
ss=0 &&
break
sleep 60
k=$((k+1))
done
if [ "$ss" -ne 0 ]
then
echo "ERROR: rsync repeatedly failed" >&2
exit 1
fi
--times
()フラグを使用する必要があります-t
。それ以外の場合、このループは使い果たされるまで繰り返されます$k
。あなたが選択したロゴの実際の目的を理解していますか?それらは奇妙なものなので、ほとんどを取り除くことをお勧めします。
rsync -rtS
--info=progress2 \
--log-file="$rsync_file_basename.log" \
--log-file-format="%o=%-7'''b | total=%-7'''l [%i] => %f%L" \
"/mnt/disk$disk_id/$share_name/$share_subdir/" \
"$target_path"
最後に、SMB共有を提供するサーバーに直接アクセスできる場合は、rsync
ネットワークモードで使用すると、再試行速度が(少なくとも)大幅に向上します。
rsync -rtSz local_path/ remote_host:remote_path