2011-05-10 28 views
4

我的問題是當日志被旋轉時,日誌停止了python程序。 我已將其追蹤到流本身。我沒有看到任何方式來判斷流是否從python中斷。該文件被刪除後,它仍然接受寫入沒有任何問題。當文件被刪除時在python中檢測到損壞的流

import os 

FILE = 'testing.txt' 

fs = open(FILE, 'a') 
fs.write('word') 
os.remove(FILE) 
fs.write('Nothing....') # Nothing breaks 
print(fs.errors) # No errors 

那麼,如何才能知道文件流是否仍然有效? 並檢查文件是否存在將無濟於事,因爲文件將始終存在,無論流是否仍然有效。

+0

什麼操作系統和你使用的是什麼版本的Python?我試着運行這個和os.remove(文件)給了我一個錯誤;它說這個文件正在使用中!我沒有在任何其他程序中打開它,所以它一定是它在Python中打開。我在這檯筆記本電腦上使用XP,因爲它是我的學校計算機,它只有Python 2.5 – Curlystraw 2011-05-10 19:37:49

+0

有趣。我的目標是Linux(redhat)和Python 2.6.5。 我在Linux(Ubuntu)Python 2.7.1中測試了代碼 – 2011-05-10 19:45:33

回答

2

經過更多的檢查,我找到了解決方案。這是一個操作系統特定的問題。當文件在Linux(或Macintosh)中被刪除時,它只是取消了鏈接。 (我沒有意識到這一點) 所以如果你在機器上運行lsof,它仍然顯示文件爲打開狀態。

[[email protected]]$ lsof | grep --color -i "testing.txt" 
python26 26495 user 8w  REG    8,33  23474  671920 /home/user/temp/testing.txt (deleted) 

解決方法是在python中統計流。

stat = os.fstat(fs.fileno()) 

這會給你它的鏈接數量。

if stat.st_nlink < 1: 
    #has been deleted 

然後你去了。現在你知道你是否應該重新加載它。希望這可以幫助別人。

0

嘗試Exception handling

import os 

FILE = 'testing.txt' 

try: 
    fs = open(FILE, 'a') 
    fs.write('word') 
    os.remove(FILE) 
    fs.write('Nothing....') # Nothing breaks 
except Exception, e: 
    print "Error:", e 
print(fs.errors) # No errors 
0

有用於ionotify python綁定,如果你需要的不僅僅是一個try: except:條款更多的智能。但我認爲它只適用於Linux(我不知道你的平臺)

0

我發現的另一個解決方案是將「copytruncate」標誌添加到logrotate配置中。 有關更多信息,請參閱「man logrotate」。