2011-05-31 40 views
2

我想寫一個腳本或一段代碼來存檔文件,但我不想存檔任何當前打開的文件。我需要找到一種方法來確定打開目錄中的文件。我想要使​​用Perl或shell腳本,但可以嘗試在需要時使用其他語言。它將在Linux環境中,我沒有選擇使用lsof。我也有熱熔器的不一致的結果。謝謝你的幫助。如何判斷當前用戶打開哪些文件?

我正在嘗試將目錄中的日誌文件移動到另一個目錄。如果文件是開放的,我不想對他們做任何事情。

+0

即使您檢測到本地打開,您也無法找到誰通過nfs打開了文件。 – mark4o 2011-05-31 16:26:36

+1

*爲什麼*不是lsof? (對此的回答也可能排除其他解決方案...) – ysth 2011-05-31 16:48:04

回答

1

嘗試ls -l /proc/*/fd/*作爲根。

+1

這隻會告訴你當你運行命令時打開的是什麼,而不是現在打開的或者自從打開和關閉的。 – msw 2011-05-31 15:59:03

+1

否,當進程打開並關閉文件描述符時,'/ proc/*/fd'不會更新。 – mob 2011-05-31 16:10:39

+2

,並且在讀取'/ proc'和打開文件之間的延遲時,任何事情都可能發生。 – msw 2011-05-31 16:18:09

3

您正在錯誤地接近問題。您希望在閱讀時防止文件在您的下面被修改,並且在沒有操作系統支持的情況下無法執行此操作。您可以在多用戶系統中獲得最好的效果,即保持歸檔元數據的一致性。

例如,如果要創建存檔目錄,請確保存檔在存檔中的字節數與目錄匹配。您可以在讀取文件系統之前和之後校驗文件內容,並將其與您寫入檔案的內容進行比較,並可能將其標記爲「不一致」。

你想完成什麼?

新增迴應評論:

logrotate竊取有關如何處理這種一致只是在用它做的工作給你的想法。如果您擔心的文件重命名將使得當前寫他們將打破東西的過程,看看man 2 rename

重命名()重命名文件,如果需要的話目錄之間移動它 。任何 其他到文件的硬鏈接(如使用鏈接(2)創建的 )不受影響。 舊路徑的打開文件描述符 也不受影響。

如果NEWPATH已經存在,它將被替換原子(受 幾個條件;看到錯誤 下文),以便有在 不點,這另一個進程試圖 訪問NEWPATH會發現它不見了。

+0

我基本上是試圖把一個目錄中的日誌文件,並將它們移動到另一個目錄。如果文件是開放的,我不想對他們做任何事情。 – Anthony 2011-05-31 16:08:49

+0

@Anthony:爲什麼?你可以解釋嗎?最好的答案是程序上知道哪些文件正在寫入... – ysth 2011-05-31 16:50:53

1

msw已經正確回答了這個問題,但是如果你想提交打開的進程列表,lsof命令會給你。

相關問題