Linux的tail/tailf命令使用了内核提供的inotify功能,下面的Python例子也使用inotify实现比tail/tailf更强的监控文件功能。

watchfile.py

#!/usr/bin/python
import sys, os, pyinotify notifier = None
monfile = None
lastsize = 0
wm = None
wd = 0 def roll_file(filename):
global lastsize
fd = os.open(filename, os.O_RDONLY)
try:
newsize = os.fstat(fd).st_size
if newsize <= lastsize: return
os.lseek(fd, lastsize, os.SEEK_SET)
while True:
data = os.read(fd, 4096)
if not data: break
sys.stdout.write(data)
sys.stdout.flush() pos = os.lseek(fd, 0, os.SEEK_CUR)
lastsize = pos if pos != lastsize else newsize
finally:
os.close(fd) class EventHandler(pyinotify.ProcessEvent):
def process_IN_CREATE(self, event):
if monfile == event.pathname:
global wd
wd = wm.add_watch(monfile, pyinotify.IN_MODIFY).values()[0]
roll_file(monfile) def process_IN_DELETE(self, event):
global wd, lastsize
if monfile == event.pathname:
if wd > 0:
try: wm.rm_watch(wd, quiet=False)
except pyinotify.WatchManagerError: pass
wd = 0
lastsize = 0 def process_IN_MOVED_FROM(self, event):
self.process_IN_DELETE(event) def process_IN_MOVED_TO(self, event):
self.process_IN_DELETE(event)
self.process_IN_CREATE(event) def process_IN_MODIFY(self, event):
roll_file(monfile) def main():
global notifier, lastsize, wm, wd, monfile
monfile = os.path.abspath(sys.argv[1])
print "path={0}".format(monfile) lastsize = os.stat(monfile).st_size wm = pyinotify.WatchManager()
notifier = pyinotify.Notifier(wm, EventHandler())
wd = wm.add_watch(monfile, pyinotify.IN_MODIFY).values()[0]
wm.add_watch(os.path.dirname(monfile), pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_MOVED_FROM | pyinotify.IN_MOVED_TO)
print "watching {0} ...".format(monfile) while True:
notifier.process_events()
if notifier.check_events():
notifier.read_events() if __name__ == "__main__":
try:
main()
finally:
if notifier: notifier.stop()

使用方法:

./watchfile.py ~/test.log

被监控的文件做改名、删除、创建的操作都可以继续监控。

利用pyinotify监控文件内容,像tailf命令但比它更强的更多相关文章

  1. shell编程系列12--文本处理三剑客之sed利用sed修改文件内容

    shell编程系列12--文本处理三剑客之sed利用sed修改文件内容 修改命令对照表 编辑命令 1s/old/new/ 替换第1行内容old为new ,10s/old/new/ 替换第1行到10行的 ...

  2. grep sed awk 3个Linux中对文件内容操作的命令

    在学习Linux命令中,发现3个有关于文件内容操作的命令grep,sed和awk,在这里简单汇总这3个命令主要作用,在实际中找到最合适的情景应用,详细用法可以参考其他文章. 1.grep命令 主要作用 ...

  3. shell编程系列13--文本处理三剑客之sed利用sed追加文件内容

    shell编程系列13--文本处理三剑客之sed利用sed追加文件内容 追加用法总结: .a 在匹配行后面追加 .i 在匹配行前面追加 .r 将文件内容追加到匹配行后面 .w 将匹配行写入指定文件 追 ...

  4. Linux 学习笔记 查看文件内容诸多命令

    查看文件内容 1.查看文件统计信息 stat 提供文件系统上某个文件的所有状态信息 2.查看文件类型 file 用来查看文件类型 (该命令将文件分成3类:文本类型:可执行文件:数据文件) 如果你有从未 ...

  5. linux查看文件内容的常见命令

    1.cat命令,显示文件的所有内容,内容过多则显示最后一屏一般用于内容较少文件 2.more命令,分页显示文件的内容一般用于文件内容过多的文件,回车显示下一行,空格显示下一页,q/Q退出 3.head ...

  6. 监控文件内容变化,即时写入到新文件(tail)

    监控文件a,如有新内容写入,即时将新内容写入到新文件aa中: fw=open('e:\\aa.txt','ab') with open('e:\\a.txt','rb') as fo: while T ...

  7. Linux中查找文件和文件内容的常用命令

    一.whereis <程序名称> 查找软件的安装路径-b 只查找二进制文件 -m 只查找帮助文件-s 只查找源代码-u 排除指定类型文件-f 只显示文件名-B <目录> 在指定 ...

  8. Linux文件内容查看相关命令

    1.more命令 在Linux中,more命令是一个基于vi编辑器的文本过滤器,它能以全屏的方式按页显示文本文件的内容,more里面内置了一些快捷键. (1)命令语法 more(选项)(参数) (2) ...

  9. 利用nodejs监控文件变化并使用sftp上传到服务器

    很久没写博客了,因为最近在用react+express做一个自己的工具型网站(其实就是夺宝岛抢拍器) 然后因为经常要改动,而且又要放到服务器上进行测试.总是要webpack,然后手动把文件上传上去,不 ...

随机推荐

  1. 阅读MDN文档之布局(四)

    Introducing positioning Static positioning Relative positioning Introducing top, bottom, left and ri ...

  2. PCI_Making Recommendations

    协作性过滤 简单理解从众多用户中先搜索出与目标用户'品味'相似的部分人,然后考察这部分人的偏爱,根据偏爱结果为用户做推荐.这个过程也成为基于用户的协作性过滤(user_based collaborat ...

  3. Linux Redis 重启数据丢失解决方案,Linux重启后Redis数据丢失解决方

    Linux Redis 重启数据丢失解决方案,Linux重启后Redis数据丢失解决方案 >>>>>>>>>>>>>> ...

  4. 玩玩微信公众号Java版之五:获取关注用户信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同).公众号可通过本接口来根据Op ...

  5. (转)Linux系统安装时分区的选择

    场景:对于Linux系统的分区总是迷迷茫茫的,还是实践少,基础不牢. 以前初识Linux时,对Linux系统安装时分区的选择,一点都不了解,导致几次没法进行下一步安装,因此就静下心来,专门拿出时间研究 ...

  6. 浅谈lvs和nginx的一些优点和缺点

    借鉴一些网上资料整理了简单的比较: LVS的负载能力强,因为其工作方式逻辑非常简单,仅进行请求分发,而且工作在网络的第4层,没有流量,所以其效率不需要有过多的忧虑. LVS基本能支持所有应用,因为工作 ...

  7. FPGA计算3行同列数据之和

    实验:FPGA计算3行同列数据之和 实验要求:PC机通过串口发送3行数据(一行有56个数据,3行共有56*3=168个数据)给FPGA,FPGA计算3行同一列数据的和,并将结果通过串口返回给上位机. ...

  8. C#小爬虫,通过URL进行模拟发送接收数据

    public async Task<string> SendDataAsync(HttpMethod httpMethod, string requestUrl, HttpContent ...

  9. java连接数据库

    package com.shsxt.jdbcs; import java.sql.Connection; import java.sql.DriverManager; import java.sql. ...

  10. [译] 所有你需要知道的关于完全理解 Node.js 事件循环及其度量

    原文地址:All you need to know to really understand the Node.js Event Loop and its Metrics 原文作者:Daniel Kh ...