わずか2時間後にrsyncファイルが変更されませんでしたか?

わずか2時間後にrsyncファイルが変更されませんでしたか?

約2時間ごとに新しいバイナリを作成するリモートサーバーにアプリケーションがあります。 6分ごとに新しいデータがあると、ファイルが更新されます。 19回の追加後に閉じます。つまり、6分ごとに新しいデータがある場合は、1時間54分後に閉じます。

寄木細工のファイルです。

  • Parquetファイルは閉じないまで添付できます。これが私のアプリケーションがやっていることです。
  • 寄せ木細工ファイルは閉じられるまで開けません。

ファイル名は以下の形式をとります。最後の数字はファイルが生成されたタイムスタンプです。このタイムスタンプは後で更新されません。

my-data-1602915797.parquet
my-data-1609890860.parquet
my-other-d-1609990998.parquet
my-other-d-1610000010.parquet

ファイル全体が作成され、ローカル(8Toローカルハードドライブ)に安全にコピーされたら、リモートから削除する必要があります(リモートには160Goハードドライブのみがあります)。アプリケーションは4〜5 Goの空あたりのデータ。

月に一度このファイル転送を開始する予定です。

だからすでに終わったものだけを移動したいと思います。これを選択するには、SSHを使用できます。

# IP address is a dummy address ;)
ssh [email protected] "find /root/my_data -name *.parquet -maxdepth 1 -type f -mmin +180"

次に入力しますrsync

しかし、それから私は知りました。このスレッドを利用すれば解決が可能だそうです rsync -a

rsyncのマニュアルページを見ると、このパラメータがこれらのニーズをどのように満たすのかわかりません。誰でも私がこれを理解するのを助けることができますか?

フィードバックをお寄せいただきありがとうございます。本当にありがとうございます。

答え1

rsync説明に従ってファイルをコピーし、コピーが成功した後に削除できます。

rsync --dry-run -avz --remove-source-files [email protected]:'$(find /root/my_data -maxdepth 1 -name "*.parquet" -type f -mmin +30)' /my/destination

ご注意ください、

  • $( find ... )ローカルサーバーではなくリモートサーバーのコンテキストで実行されるように計算されたコマンドを二重引用符ではなく一重引用符で囲みます。
  • *.parquetシェルが1つ以上の寄木細工が細工ファイルと一致するのを防ぐ方法を引用しました。
  • 最後のアップデート以降、遅延時間を180分からわずか30分に短縮しました。 (最新のファイルが6分ごとに更新されると言ったので、30分で十分です。)
  • -z私はネットワーク接続からデータストリームを圧縮しました。事前圧縮されたデータを使用しても、これは少し役立ちます。
  • このディレクトリは、/my/destination寄木細工ファイルが移動されたローカルディレクトリです。

--dry-runこの機能を有効にして何が起こるかを確認し、期待される結果に満足したらパラメータを削除することをお勧めします。

--progress各ファイルの転送の進行状況をリアルタイムで見たい場合は、追加してください。-Pまたはここを使用しないでください--partial

「閉じた」ファイルを識別する簡単な方法はないことを指摘したいと思います。を使用するコードを書くか、スイートで提供されるlsofいくつかのコードを書くことができます。inotify私がここでやっていることは、オペレーティングシステムがそれに応じてファイルの変更時間を自動的に更新できるように、アプリケーションを使用して最後の更新から30分以内に現在のファイルに書き込むことです。アプリケーションがファイル変更時間(ファイル名ではなくメタデータ)を操作すると、問題が発生します。

最もきれいな解決策は、アプリケーションを変更してファイルを生成し*.parquet.tmp*.parquet作成が完了したらそのファイルの名前を変更することです。 (これにより、ファイルだけが完全にコピーに適していることを保証できます*parquet。)しかし、これは不可能かもしれません。

答え2

ファイルを実際にコピーできない場合(ファイルが閉じられていない場合)、findファイルリスト生成を使用できます。rsync

直接使用することもできますrsync。開いたファイルの一部をコピーしますが、なぜ重要なのですか?変更したら、rsync更新されたことを確認して同期できます。

答え3

@Lucasの提案を使ってナビゲートしながら、次のlsof2行を思い出しました。

コマンド出力をlsofきれいなファイル名のリストにフォーマットすることはかなり複雑になります。ただし、この方法では、ファイルを生成したアプリケーションで何が行われたかに関係なく、閉じたファイルのみが保持されます。

ssh root@"$RMT_IP" "lsof +D "$RMT_PATH_DATA" | tr -s ' ' | cut -d' ' -f9 | tail -n +2 | grep '.parquet$' | xargs -n 1 basename"  > "$OPEN_FILES"
rsync --dry-run -avv --remove-source-files --exclude-from="$OPEN_FILES" root@"$RMT_IP":"$RMT_PATH_DATA"/*.txt "$TEMP_LOC_PATH"

-vvパラメーターは、スキップさrsyncれた詳細情報ファイルを生成します。テストファイルで$OPEN_FILESリストが正しく読み取られていることを確認できます。

関連情報