免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6109 | 回复: 9
打印 上一主题 下一主题

perl如何监控文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-01 00:35 |只看该作者 |倒序浏览
现在有几个文件,想使用perl来实时的监控这些文件变化。如果某个发生了变化就将这个文件变化的部分打印出来!
有没有什么好的办法或者告诉我用哪个mode!谢谢了!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-03-01 00:57 |只看该作者
什么操作系统?

论坛徽章:
0
3 [报告]
发表于 2008-03-01 02:05 |只看该作者
新手瞎说一句:

1、定期检查文件的修改时间,如果和上次的变化了,那么就确定该文件被修改(并保存当前的修改时间为比较标志)

2、如果确定该文件被修改,那就比较该文件和的变化并打印出来(并保存当前文件以作下一次文件比较)

只想到这样做,不过感觉这办法好老土。而且当文件较大的时候,是很烦人的。再有一个就是,我不知道PERL读文件的时候,该文件会不会被锁住;如果被锁住,对该文件的更新不知道有没有影响。

论坛徽章:
0
4 [报告]
发表于 2008-03-02 14:16 |只看该作者

回复 #1 mousejsh 的帖子

如果文件不大就把文件按行做个hash,并计算文件的原始md5码。判断md5码的变化,如果不同,就比对一次差异。呵呵。前提就是文件不能太大。大了,就只能把文件的原始本保留,发现md5不同,就直接用diff得出不同就好了。

个人浅见。呵呵

论坛徽章:
0
5 [报告]
发表于 2008-03-03 08:55 |只看该作者
本人用的是redhat as4 操作系统。现在用File::Modified,只能是哪个文件发生变化了。但没有将变化的部分打印出来,我现还想要变化的部分显出来,保存文件也可以。

论坛徽章:
0
6 [报告]
发表于 2008-03-03 09:57 |只看该作者
这个文件是不是像日志那样追加的,如果那样,直接管道打开tail命令
open(FILE,"tail -F $FILE | ")

论坛徽章:
0
7 [报告]
发表于 2008-03-03 10:21 |只看该作者
现在的做法都是从判断文件是否变化入手,如果可以有比如监控某个inode的钩子,任何写入这个inode的数据都可以钩出来那最好了。。

论坛徽章:
0
8 [报告]
发表于 2008-03-04 17:39 |只看该作者
类似于cvs版本控制。

论坛徽章:
0
9 [报告]
发表于 2008-03-12 19:38 |只看该作者
程序启动的时候,读取文件长度.文件上次修改时间.然后保存..不停的读时间,初始的时间做对比,只要有变化就打印.

1.取动perl脚本.设置初始的
时间变量
文件偏移变量

2.不停的读到时间,并与时间变量中的值做对比..只要时间改变了..将这个改变后的值.赋给时间变量.

3.读取文件偏移..打开文件,将文件偏移变量中的值做为起始输出位置,到当前读取到的文件偏移位置..

就这样不停的循环.

好下效率很低下啊.

论坛徽章:
0
10 [报告]
发表于 2008-03-12 19:46 |只看该作者
找到点资料.给楼主看看吧.

如何实现perl版的tail命令?
ELM 发表于: 2006-11-30 14:18 来源: 榆树社区
这里简单介绍一下如何使用perl实现简单的tail功能。

tail命令是常用的unix工具,可以实时的监视文本的变化,做email的朋友最常用tail来监视日志的变化。

通过perl可以实现一个非常简单的tail,它可以监视日志的变化,并实时的打印出来。


1)产生变化内容的程序例子(genlog.pl)
CODE:

use IO::Handle;
open (FD, "> /tmp/test.log") or die $!;
FD->autoflush(1);
while (1) {
    my $now = time;
    print FD $now, "\n";
    sleep 1;
}
close FD;
这个小程序在/tmp目录下产生一个test.log的临时文件,并且每隔1秒写入当前时间的unix 时间戳

因此用普通的tail命令可以看到/tmp/test.log的内容是不断增长的。要注意的是红色的那行将

文件描述FD设置为自动冲刷(缓冲区),因此凡是写入的信息都立刻同步到磁盘,如果没有这行

那么写入的内容不能立刻反应到test.log里。


下面我们来设计一个读取这个增长内容的小程序。

2)perl版tail
CODE:

open (FD, "< /tmp/test.log") or die $!;
while (1) {
    my $in = <FD>;
    print $in;
}
close FD;
这个程序更简单。只要可读,将不断的读取/tmp/test.log的内容。通过这2个小程序,就演示了

如何监视不断增加的日志的方法。perl来实现这些工作,实在是太简单了!
http://www.wenzk.net/index.php/viewthread-577.shtml
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP