Phi*_*ing 6 python linux file-monitoring inotify
我正在读取一组文件(日志文件)中的行,因为它们是使用 pyinotify 编写的。
我正在使用 python 本机方法打开并读取文件:
file = open(self.file_path, 'r')
# ... later
line = file.readline()
Run Code Online (Sandbox Code Playgroud)
这通常是稳定的,可以处理被删除和重新创建的文件。pyinotify 将通知取消链接和后续链接。
但是,某些日志文件不会被删除。相反,它们被截断并将新内容写入同一文件的开头。
我无法可靠地检测何时发生这种情况,因为 pyinotify 仅报告写入。我目前得到的唯一证据是 pyinotify 报告写入并readline()返回一个空字符串。但是,后续的两次写入可能会触发相同的行为。
我曾考虑过比较文件的大小,file.tell()但根据文档tell会产生一个不透明的数字,并且似乎不能相信这是一个字节数。
有没有一种简单的方法来检测文件在读取时是否被截断?
编辑:
可以使用简单的 shell 命令来模拟截断文件:
echo hello > test.log
echo hello >> test.log
# Truncate test.log
echo goodbye > test.log
Run Code Online (Sandbox Code Playgroud)
为了补充这一点,可以使用一个简单的 python 脚本来确认file.tell()文件被截断时不会减少:
foo = open('./test.log', 'r')
line = foo.readline()
while line != '':
print(foo.tell())
print(line)
line = foo.readline()
# Put a breakpoint on the following line and
# truncate the file before it executes
print(foo.tell())
Run Code Online (Sandbox Code Playgroud)
用于os.lseek(file.fileno(),0,os.SEEK_CUR)获取字节偏移量而不移动文件指针。您可以\xe2\x80\x99t 真正使用常规文件接口来查找,尤其是因为它可能具有尚未\xe2\x80\x99t 对Python 可见的缓冲文本(不再存在)。如果文件不是字节流(例如,Python 3 中的默认值open),它甚至可能位于多字节字符的中间,并且即使文件立即增长到超过文件偏移量,也无法继续。
| 归档时间: |
|
| 查看次数: |
2310 次 |
| 最近记录: |