rsync
同じコンピュータにある2つのフォルダを同期するために使用します。
ファイルは他のアプリケーションのソースフォルダに書き込まれます。私たちが持っている問題は、ファイルがソースフォルダに完全に書き込まれていない場合でも、rsyncがファイルをターゲットにコピーすることです。
確認/転送する方法/オプションはありますか?ただソースフォルダのフルファイル
答え1
そのような概念が存在しないため、部分ファイルを除外することは不可能です。クリエイターがファイルを作成すると、ファイルは存在しますが、最初は空になってから徐々に入力されます。
ファイルが書き込み用に開いていることをテストすると、ファイルが不完全であることがわかります。しかし、これは信頼できません。プロデューサーがクラッシュすると(プロセスがクラッシュした場合、またはシステム全体がクラッシュした場合)、完全に見える不完全なファイルが生成されます。
あなたがしなければならないのは、プロデューサーがファイルを完了としてマークするためのプロトコルを定義することです。これを行う一般的な方法(そしてほぼ唯一の合理的な方法)は、クリエイターが一時的な場所にファイルを作成し、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:
答え2
ファイルサイズが固定されている場合(アプリケーションの書き込み操作後)、サイズのみに基づいてファイルを転送できるため、書き込みが完了していないファイルはコピーされません。
--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
答え3
過去30分間に変更されていないすべてのファイルを見つけるために、次のコマンドを使用しました。
ssh sourceServer "find sourceDir -mmin +30 -type f | xargs -i -r rsync [ --remove-sent-files ] -aP {} destServer:destPath/"