1

In Ubuntu if a file /A/largefile.foo is moved via 'cp' or 'mv' to /B/largefile.foo, how can I ensure that the entire file is written before attempting to move the file a second time to /C/largefile.foo?

Case: 1. An remote automated Script X begins an rsync to destination folder A of a very large file. 2. A cron job on the local machine hourly moves files from folder A to folder B, but I do not want to copy partial files (I only want files that have finished uploading completely)

Case: 1. A cron job periodically moves files from folder B to folder C, but I do not want to copy partial files (I only want files that have finished uploading completely)

Note: I'm looking for a solution that does not require the addition of pid files

4

4 に答える 4

4

最初のrsyncケースでは、--partial-dirと組み合わせてオプションを使用できます。これにより--delay-updates、部分的なファイルが別の場所に書き込まれ、完了したら名前が変更されます。

部分ディレクトリが宛先と同じファイルシステム上にあることを確認する必要があります。これにより、名前の変更がアトミックになります。

2番目のケースではmv(ここでも1つのファイルシステムを想定)、アトミックになります。

詳細については、rsyncのマニュアルを参照してください

于 2010-08-09T14:07:32.077 に答える
1

一般的なアプローチは、「。part」サフィックスが付いたファイルをコピーすることです。コピーが完了すると、スクリプトはファイルの名前を変更して.partを削除します。他のスクリプトは、単に.partファイルを無視する必要があります。

これは、ダウンロードマネージャーやFTPプログラムなどが行っていることです。

于 2010-08-09T13:58:59.650 に答える
1

rsyncを使用します。元のファイルと宛先の新しいファイルをmd5sumすることもできます(cpの場合)

于 2010-08-11T19:49:10.877 に答える
0

移動操作は、1つのファイルシステム内のPOSIXでアトミックです。

ファイルを開いてファイルシステムから削除した場合でも、ファイルに書き込むことができます。そのため、ログをローテーションした後、syslogdにファイルハンドルを再度開くように指示する必要があります。

解決策は、最初に一時ファイルに書き込み、次にそれを宛先に移動することです。--delay-updatesrsyncのオプションは、まさにこれを実行します。

于 2010-08-11T03:29:48.303 に答える