Co2y's Blog

一个关于实时监听文件变动的问题

某同学问了我一个奇怪的问题,在此记录一下

问题

以下这段代码的本意是打开一个文件,找到文件结尾,然后实时打印在文件结尾添加的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
__author__ = 'co2y'
import time
def follow(the_file):
with open(the_file) as f:
f.seek(0, 2)
while True:
line = f.readline()
if not line:
time.sleep(0.1)
continue
yield line
lines = follow('a.txt')
for line in lines:
print(line)

在测试时发现,首先运行程序,然后用sublime打开a.txt,编辑然后保存,新增的内容可以正常打印出来,但是用vimtexteditor编辑保存却打印不出新增的内容,并且在vim编辑之后再用sublime修改也无法打印新增的内容。

问题大概就是这么个情况,经过一番搜索没找到什么有用的信息(主要原因还是英文太渣,不知道怎么表述。。)。

之后想到tail -f不也是实时查看文件结尾变动情况么,发现用tail -f得到的结果和以上这段代码表现出来的是一样的,那么就好搜索了。

原因

经过搜索tail -f不起作用之后,我知道了原来vimtexteditor等编辑器会重新生成一个文件并且干掉之前的文件,所以他们的inode不一样了。具体的inode可以用ls -i查看。而echo "xxx" >> a.txt或者sublime是直接修改文件并不改变inode号,所以f指针才能够追踪到文件的变化。