rsync
を使用して、同じマシン上の2つのフォルダーを同期しています。
ファイルは別のアプリケーションからソースフォルダに書き込まれます。ファイルがソースフォルダに完全に書き込まれていなくても、rsyncがそのファイルを宛先にコピーするという問題があります。
チェック/転送する方法/オプションはありますかのみソースフォルダから完全なファイル
ファイルのサイズが固定されている場合(アプリケーションの書き込み操作後)、サイズに基づいてファイルのみを転送できるため、まだ書き込みが行われていないファイルはコピーされません。
--max-size=SIZE don't transfer any file larger than SIZE
--min-size=SIZE don't transfer any file smaller than SIZE
rsync
のオプションはそれを提供します。
または、fuser
またはlsof
を使用して、転送の開始時にアプリケーションがファイルに書き込んでいるかどうかを確認できます。
if fuser /path/to/file.txt >/dev/null 2>&1; do
rsync ....
else
sleep 10
fi
そのような概念がないため、部分的なファイルを除外することは不可能です。プロデューサーがファイルを作成するとすぐにファイルは存在しますが、最初は空で、徐々にいっぱいになります。
ファイルが書き込み用に開いているかどうかをテストできます。それはそれが不完全であることをあなたに告げるでしょう。ただし、これは信頼できません。プロデューサーがクラッシュした場合(プロセスがクラッシュした場合、またはシステム全体がクラッシュした場合)、完全に見える不完全なファイルが残ります。
あなたがすべきことは、プロデューサーがファイルを完了としてマークするためのプロトコルを定義することです。これを行う通常の方法(そしてほとんど唯一の正しい方法)は、プロデューサーが一時的な場所にファイルを作成し、それを所定の場所に移動することです(rename
システムコールまたはmv
シェルコマンド)終了したとき。
命名規則を使用できます。
プロデューサー:$FILENAME.tmp
に書き込んでから、最終ファイルに移動します。
generate_data >"dir/$FILENAME.tmp"
mv "dir/$FILENAME.tmp" "dir/$FILENAME"
コンシューマー:.tmp
ファイルを除外します。
rsync -a --exclude='*.tmp' dir remote:
または、ステージングディレクトリを使用できます。
プロデューサー:ステージングディレクトリに書き込み、最終的な場所に移動します。
generate_data >"dir/staging/$FILENAME"
mv "dir/staging/$FILENAME" "dir/"
コンシューマー:ステージングディレクトリを除外します。
rsync -a --exclude='/staging' dir remote:
次のコマンドを使用して、過去30分間に変更されていないすべてのファイルを検索します。
ssh sourceServer "find sourceDir -mmin +30 -type f | xargs -i -r rsync [ --remove-sent-files ] -aP {} destServer:destPath/"