删除文件时在python中检测损坏的流

时间:2011-05-10 19:12:02

标签: python linux stream delete-file logrotate

我的问题是当日志被旋转时,日志记录会停止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

那么,我怎样才能知道文件流是否仍然有效? 并检查该文件是否存在将无济于事,因为无论该流是否仍然有效,该文件将始终存在。

4 个答案:

答案 0 :(得分:2)

经过更多的检查,我找到了解决方案。这是操作系统特定的问题。在Linux(或Macintosh)中删除文件时,它只是取消链接。 (我不知道这个) 因此,如果您在计算机上运行lsof,它仍会将文件显示为打开。

[user@machine]$ 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

你去吧。现在您知道是否应该重新加载它。希望这有助于其他人。

答案 1 :(得分: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

答案 2 :(得分:0)

如果你需要更多的智能而不仅仅是try: except:子句,那么有一些用于ionotify的python绑定。但我认为它只与Linux相关(我不确定你的平台)

答案 3 :(得分:0)

我发现的另一个解决方案是将“copytruncate”标志添加到logrotate配置中。 有关详细信息,请参阅“man logrotate”。