2012-08-27 30 views
0

將文件從machine1/dir1複製到machine2/dir2。我在dir2上添加了一個inotify監視器,用於創建任何新文件。現在如果文件很大,可能需要幾秒鐘才能完全在新機器上。如果我沒有錯,Inotify會在檢測到事件後立即通知應用程序。所以如果文件狀態必須被檢查,應該怎麼做?inotify:如何在傳輸完成後通知目錄中的新文件?

+2

您是否嘗試使用IN_CLOSE_WRITE inotify事件?如果傳輸應用程序沒有打開並關閉收到的每個數據包的文件,它可能會工作。 –

+0

IN_CLOSE_WRITE是一個不錯的選擇。將退房。 – King

回答

1

如果IN_CLOSE_WRITE只有一臺機器上的scp,否則,這取決於文件從一臺機器上傳到另一臺機器的方式。如果一次打開和關閉,IN_CLOSE_WRITE就是實現它的方法。

上述兩個答案都有意義,這取決於我們如何做到這一點。

2

無法回答此問題,因爲它取決於應用程序環境和要求。它可能會看到文件未被修改60秒。它可能需要每隔幾秒檢查一次。這取決於。

3

保存帶有臨時文件名(或其他目錄)的下載文件,並在文件成功移動時將其重命名爲預期的文件名。

例如Nginx使用此方法來存儲緩存的數據 緩存數據首先被寫入臨時文件,然後將其移動到緩存目錄中的最終位置。廉價和原子重命名系統調用執行,而不是完整的文件副本因此,最好在兩個位置使用相同的文件系統

+0

這是要走的路。沒有辦法找出文件是否仍在寫入 - 你可以做的最好的事情是找出是否有其他程序打開了這個文件,但這是一個很大的努力(它需要枚舉所有已打開的文件進程),需要root權限,並且在有相同想法的其他程序(例如病毒掃描程序)周圍時很難正確使用。 –

+1

最簡單的方法是使用'rsync'進行復制。 –

+0

rsync完全一樣,我的意思是它創建臨時文件並重命名它比 – hostmaster

相關問題