web-dev-qa-db-ja.com

部分的なファイルを除外するrsyncオプション

rsyncを使用して、同じマシン上の2つのフォルダーを同期しています。

ファイルは別のアプリケーションからソースフォルダに書き込まれます。ファイルがソースフォルダに完全に書き込まれていなくても、rsyncがそのファイルを宛先にコピーするという問題があります。

チェック/転送する方法/オプションはありますかのみソースフォルダから完全なファイル

3
SpringUser

ファイルのサイズが固定されている場合(アプリケーションの書き込み操作後)、サイズに基づいてファイルのみを転送できるため、まだ書き込みが行われていないファイルはコピーされません。

--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
0
heemayl

そのような概念がないため、部分的なファイルを除外することは不可能です。プロデューサーがファイルを作成するとすぐにファイルは存在しますが、最初は空で、徐々にいっぱいになります。

ファイルが書き込み用に開いているかどうかをテストできます。それはそれが不完全であることをあなたに告げるでしょう。ただし、これは信頼できません。プロデューサーがクラッシュした場合(プロセスがクラッシュした場合、またはシステム全体がクラッシュした場合)、完全に見える不完全なファイルが残ります。

あなたがすべきことは、プロデューサーがファイルを完了としてマークするためのプロトコルを定義することです。これを行う通常の方法(そしてほとんど唯一の正しい方法)は、プロデューサーが一時的な場所にファイルを作成し、それを所定の場所に移動することです(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/"
0
Jason Pump