我想寫一個腳本或一段代碼來存檔文件,但我不想存檔任何當前打開的文件。我需要找到一種方法來確定打開目錄中的文件。我想要使用Perl或shell腳本,但可以嘗試在需要時使用其他語言。它將在Linux環境中,我沒有選擇使用lsof。我也有熱熔器的不一致的結果。謝謝你的幫助。如何判斷當前用戶打開哪些文件?
我正在嘗試將目錄中的日誌文件移動到另一個目錄。如果文件是開放的,我不想對他們做任何事情。
我想寫一個腳本或一段代碼來存檔文件,但我不想存檔任何當前打開的文件。我需要找到一種方法來確定打開目錄中的文件。我想要使用Perl或shell腳本,但可以嘗試在需要時使用其他語言。它將在Linux環境中,我沒有選擇使用lsof。我也有熱熔器的不一致的結果。謝謝你的幫助。如何判斷當前用戶打開哪些文件?
我正在嘗試將目錄中的日誌文件移動到另一個目錄。如果文件是開放的,我不想對他們做任何事情。
您正在錯誤地接近問題。您希望在閱讀時防止文件在您的下面被修改,並且在沒有操作系統支持的情況下無法執行此操作。您可以在多用戶系統中獲得最好的效果,即保持歸檔元數據的一致性。
例如,如果要創建存檔目錄,請確保存檔在存檔中的字節數與目錄匹配。您可以在讀取文件系統之前和之後校驗文件內容,並將其與您寫入檔案的內容進行比較,並可能將其標記爲「不一致」。
你想完成什麼?
新增迴應評論:
看logrotate
竊取有關如何處理這種一致只是在用它做的工作給你的想法。如果您擔心的文件重命名將使得當前寫他們將打破東西的過程,看看man 2 rename
:
重命名()重命名文件,如果需要的話目錄之間移動它 。任何 其他到文件的硬鏈接(如使用鏈接(2)創建的 )不受影響。 舊路徑的打開文件描述符 也不受影響。
如果NEWPATH已經存在,它將被替換原子(受 幾個條件;看到錯誤 下文),以便有在 不點,這另一個進程試圖 訪問NEWPATH會發現它不見了。
msw已經正確回答了這個問題,但是如果你想提交打開的進程列表,lsof命令會給你。
即使您檢測到本地打開,您也無法找到誰通過nfs打開了文件。 – mark4o 2011-05-31 16:26:36
*爲什麼*不是lsof? (對此的回答也可能排除其他解決方案...) – ysth 2011-05-31 16:48:04