2013-04-23 179 views
0

我用下面的命令找出是否文件描述符被打開:lsof的文件描述符被打開

/usr/sbin/lsof -a -c sqlplus -u ${USER} | grep -l "${FILE_NAME}」 

如果不是,我執行一些操作。該文件是從sqlplus假脫機的日誌。

有時lsof表明文件描述符未打開,但後來我在該文件中找到了一些新的數據。它很少發生,所以我不能重現它。

  1. 可能是什麼原因?
  2. sql spool如何工作? 它是否保留從SPOOL文件命令打開文件描述符,直到SPOOL OFF命令或打開並關閉多次文件描述符?

回答

0

您可能有一個「race condition」。 Sqlplus打開文件,在其中放入一些新數據,並在檢查文件的時間和使用lsof的結果處理文件的時間之間關閉。

通常,避免文件系統中競態條件的最好方法是在處理文件之前重命名相關文件。重命名是一個相對便宜的操作,這會阻止其他進程在您的進程處理它時打開/修改文件。您需要確保在重命名文件時,如果文件在另一個進程中處於打開狀態,您需要等待文件不再通過打開的文件句柄進行訪問,然後進程纔會處理該文件。

大多數程序員編寫的代碼充滿了競爭條件。這些會導致各種不可重複的錯誤。如果您記住幾乎所有程序都有多個進程共享資源,並且必須共享總是,那麼您將成爲更好的程序員。

+0

謝謝你的迴應。我不能只重命名文件。我需要知道所有數據都寫在那裏。我可以將一些PROMPT添加到每個sql文件的末尾,並且grep,但我想應該有更好的方法。 – idobr 2013-04-23 23:35:46

相關問題