2009-07-02 114 views
4

我們有幾個cron作業,用於將代理日誌記錄到中央服務器。這些文件可能相當大,需要一些時間進行傳輸。這個項目的一部分要求是提供一個記錄機制,在這個機制中我們記錄這些傳輸的成功或失敗。這很簡單。python是否支持EXT3

我的問題是,有沒有辦法檢查一個文件是否正在寫入?我的第一個解決方案是在給定的時間範圍內只檢查兩次文件大小並檢查文件大小。但是一位同事表示可能可以通過python掛接到EXT3文件系統,並檢查屬性以查看該文件是否正在追加到。我的Google-Fu空了。

是否有EXT3或其他可以讓我檢查文件狀態的模塊?服務器運行帶有EXT3文件系統的Fedora Core 9。

回答

7

不需要ext3特定的鉤子;只需檢查lsof,或更確切地說,/proc/<pid>/fd/*/proc/<pid>/fdinfo/*(這就是lsof得到它的信息,AFAICT)。在那裏你可以檢查文件是否打開,是否可寫,還有'光標'的位置。

這不是全部圖片;但在寫入過程中,stdlib在進程空間中完成了更多工作,因爲大多數寫入都被緩存,並且內核只能看到更大的數據塊,所以任何'ext3-aware'監視器都不會得到這樣的結果。

+0

哇,我的Linux福今天休息,從來沒有想過走這條路線。感謝你的回答! – OhioDude 2009-07-02 18:06:00

1

沒有ext3掛鉤來檢查你想要直接。

  • 我想你可以通過Fuser linux命令的源代碼挖掘,複製,用於查找該進程擁有一個文件中的一部分,並觀看該資源。當沒有人再打開文件時,文件完成傳輸。

另一種方法:

  • 你的cron作業應告訴他們完成。

我們有cron作業是傳輸文件只寫一個空filename.finished它傳輸的後。另一種方法是將它們轉移到臨時文件名,例如filename.part然後將其重命名爲文件名重命名是原子的。在這兩種情況下,你反覆檢查,直到存在filename.finished

+0

如果「複製到臨時,然後重命名」的策略是可能的,通過一切手段。使用基於硬鏈接的「快照」(如rsnapshot)更容易檢查,更容易清理,並且即使在發生災難性硬件故障時也不太可能混淆文件系統。 – Javier 2009-07-02 17:11:47