您的python腳本是否希望打開文件以供書寫或閱讀?遺留應用程序是在寫入之間打開還是關閉文件,還是保持打開狀態?
我們理解遺留應用程序正在做什麼以及您的python腳本試圖實現什麼是非常重要的。
這個功能區域與操作系統高度相關,而且您無法控制遺留應用程序的事實只會讓事情變得更加困難。無論是pythonic還是非pythonic這樣做的方式可能是你最擔心的問題 - 難的問題將是你想要達到什麼將是可能的。
UPDATE
好了,知道(從您的評論)說:
遺留應用程序的打開和 關閉每隔X分鐘的文件,但 我不想假設在t = t_0 + n * X + eps它已經關閉了 該文件。
然後問題的參數被改變。實際上,可以在一些假設條件下以獨立於操作系統的方式完成,或者作爲操作系統相關和操作系統無關的技術的組合。 :)
- OS無關的方式:如果它是安全的假設,遺留應用程序保持文件打開的最多的時候一些已知量,說
T
秒(如打開文件,執行一個寫,然後關閉該文件),並且每隔X
秒或多或少地重新打開它,其中X
大於2 * T
。
stat
文件
- 減去從
now()
文件的修改時間,產生D
- 如果
T
< = D
< X
然後打開該文件,你需要用它
- 什麼這可能是足夠安全爲您的應用程序。隨着
T
/X
的減少,安全性增加。在* nix上,您可能需要仔細檢查/etc/ntpd.conf
,以確定正確的時間步長和擺動配置(請參閱修補程序)。對於Windows看到MSDN
- 的Windows:除了(或-代替)以上的操作系統無關的方法,你可以嘗試使用兩種:
- 共享(鎖定):這個假設傳統程序也以共享模式打開文件(通常是Windows應用程序中的默認文件);此外,如果您的應用程序像傳統應用程序嘗試相同(爭用條件)一樣獲取鎖定,則傳統應用程序將失敗。
- 這是非常侵入性和容易出錯的。除非新應用程序和舊應用程序都需要同步訪問才能寫入同一文件,並且您願意處理遺留應用程序被拒絕打開文件的可能性,否則請勿使用此方法。
- 試圖找出哪些文件是在傳統的應用程序中打開,使用相同的技術ProcessExplorer(相當於* nix中的
lsof
)
- 的Linux /等。:除了(或同代替)上述操作系統無關的方法,則可能嘗試使用相同的技術
lsof
或,在某些系統中,只需查看哪個文件符號鏈接/proc/<pid>/fd/<fdes>
指向
- 你比獨立於操作系統的技術更容易受到競爭條件的影響
- 傳統應用程序使用鎖定的可能性很小,但如果是這樣,鎖定不是真正的選擇,除非傳統應用程序可以優雅地處理鎖定的文件(通過阻止,而不是失敗 - 並且如果您自己的應用程序可以保證文件不會保持鎖定狀態,請阻止舊版應用程序進行擴展。)
更新2
如果有利於「檢查遺留應用程序是否打開了該文件」(侵入性的方式容易出現競爭情況),則可以解決上述比賽通過以下條件:
- 檢查遺留應用程序是否打開文件(a la
lsof
或ProcessExplorer
)
- 暫停遺留應用程序
- 重複步驟1中的檢查以確認遺留應用程序未在步驟1和步驟2之間打開文件;如果是,請延遲並重新啓動,否則請繼續執行步驟4
- 在文件上完成您的業務 - 理想情況下只需將其重命名以用於後續獨立處理,以便將遺留應用程序暫時保留最短時間
- 恢復遺留應用程序
你試圖實現日誌旋轉? – vladr 2009-02-26 07:57:29
不完全,但不是太遠。我想在現有的應用程序之上構建一個應用程序。 – 2009-02-26 08:41:38