2010-08-09 86 views
1

在Ubuntu中,如果通過'cp'或'mv'將文件/A/largefile.foo移動到/B/largefile.foo,我如何確保整個文件被寫入在嘗試第二次將文件移動到/C/largefile.foo之前?如何確保Ubuntu中的文件副本完整性

案例: 1.遠程自動腳本X開始rsync到一個非常大的文件的目標文件夾A. 2.本地機器上的cron作業每小時將文件夾A中的文件移動到文件夾B,但我不想複製部分文件(我只想要完成上傳完成的文件)

Case: 1. A cron作業會定期將文件夾B中的文件移動到文件夾C,但我不想複製部分文件(我只想要完成上傳完成的文件)

注: 我正在尋找一個不需要的解決方案添加pid文件

回答

4

對於第一個rsync的情況,可以使用--partial-dir選項加上--delay-updates,它會將部分文件寫入一個單獨的位置,並在完成後將它們重命名爲位置。

您應該確保部分目錄與目標位於同一個文件系統中,因此重命名將是原子的。

第二種情況下使用mv(再假設一個文件系統),這將是原子。

看到rsync manual以獲取更多信息

+0

謝謝,這正是我一直在尋找! – 2010-08-18 13:44:08

1

一種常用的方法是使用「.part」後綴複製文件。複製完成後,腳本將重命名該文件以除去.part。您的其他腳本只需忽略.part文件。

這就是下載管理器,FTP程序等。

0

移動操作是在POSIX原子一個文件系統中。

如果您打開一個文件然後從文件系統中刪除它,您仍然可以寫入該文件。這就是爲什麼我們需要告訴syslogd在我們旋轉日誌後重新打開文件句柄。

解決方法是首先寫入臨時文件,然後將其移至目標位置。 對於rsync的選項--delay-updates使其完成此操作。

1

使用rsync。您也可以md5sum原始文件和目標上的新文件(如果cp)

相關問題