首页 新闻 赞助 找找看

liunx中如何判断一个文件是否正在被写

0
悬赏园豆:10 [待解决问题]

问题:我现在想要知道一个文件在linux中是否正在被写,从而我可以监控这个文件,不断读取最新被写入的内容。
我使用python的os.path.getctime(filename),获取文件的创建时间,然后再获取到系统的当前的时间,然后拿当前的减去创建的时间,从而获得差值,当这个差值小于某个值时,则判断文件处于被写入状态,我open它,并使用while True,循环读取它,每一次读完再判断差值是否超过设置的大小,如果超过则判断这个文件已经写完退出,否则继续读,当时当我执行的时候,这个文件一直被循环读取,直到超过了设置时间的一倍,才结束,我查找原因后,发现getctime,在linux中获取的文件创建时间是随着文件写入而改变的,所以才导致文件已经被写完,但是还要循环等一倍时间后才结束,因为我最后获得的一次创建时间其实是文件结束时间。
所以我现在想问问,有什么方法可以获得linux中文件的一开始创建时间,或者不通过文件的时间属性,使用其他方法或思路判断文件正在被写,有哪位大神有经验,请说一下,万分感谢!!!

star====的主页 star==== | 初学一级 | 园豆:127
提问于:2019-12-04 10:40
< >
分享
所有回答(3)
0
  • 文件的修改时间每改变一次读取一次????
获取文件修改时 存储起来(文件,mysql,redis....),   每执行一次 获取一次文件最后修改时间 于存储的时间对比,
               不同则已读取(再将修改时间存储起来)
                同则结束.
xiaobaiskill | 园豆:1087 (小虾三级) | 2019-12-04 13:37

你的意思是不断读取文件的创建时间,并把每一次获得的时间存储起来,当下一次获取的时候,拿获取到的时间和上一次存储的比较,如果相同则结束,否则继续 是吗?
但是问题是这个文件不是每秒或每分都有变化,它是在一段时间内会被写,但是你不知道确切时间点,你只知道在1:00和2:00这个时间段内,文件可能被写,但是过了2:00系统又会创建一个新的文件来记录

支持(0) 反对(0) star==== | 园豆:127 (初学一级) | 2019-12-04 14:28

@star====: 那你两点的时候读旧文件呗

支持(0) 反对(0) xiaobaiskill | 园豆:1087 (小虾三级) | 2019-12-04 15:11

@xiaobaiskill:额,但是我现在的需求就是要一直监控这个正在被写的文件,它写入一行,我就要读一行,有点类似于实时读取

支持(0) 反对(0) star==== | 园豆:127 (初学一级) | 2019-12-04 15:29
1

Linux Inotify ,这个可以监控文件的改动

电磁魔王喵喵 | 园豆:1339 (小虾三级) | 2019-12-04 15:05

要读取最新的写入,可以记录一下上次读取到了第几行,下次直接从这一行开始读,不必从头读取

支持(0) 反对(0) 电磁魔王喵喵 | 园豆:1339 (小虾三级) | 2019-12-04 15:10

@电磁魔王喵喵: 这个inotify是c语言的用法吗,它的用法是怎样的,可以举个例子吗?
第二个想法,你的意思是用python的tell和seek吗?

支持(0) 反对(0) star==== | 园豆:127 (初学一级) | 2019-12-04 15:27

@star====: paython 没用过,搜索到了一个 paython 的 pyinotify库
大概原理是监听某个文件,文件有修改时执行你的读取程序,

python的tell和seek ,配合使用可以从上次读取的位置继续读取,是为了减少不必要的读取

支持(0) 反对(0) 电磁魔王喵喵 | 园豆:1339 (小虾三级) | 2019-12-04 16:38
0

楼上说的inotify是解决方案
inotify本身是c语言写的,具体介绍 https://developer.ibm.com/tutorials/l-inotify/ 这个看到
至于其他语言,java python等网络很多的开源库适配好了,直接用就行
python的一个例子 https://www.cnblogs.com/bonelee/p/9668185.html

2012 | 园豆:21228 (高人七级) | 2019-12-05 18:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册