http://qs321.pair.com?node_id=846576

xbmy has asked for the wisdom of the Perl Monks concerning the following question:

Hi all:

I am writing a script to monitor one file's change using the following code.

#!/usr/bin/perl -w use strict; use IO::Handle; my $file='data.txt'; #file to be monitored open (FD, "$file") or die $!; my $oldsize= -s "$file"; my $newsize= -s "$file"; my @change=$newsize-$oldsize; until ($change[0]!=0){ wait; #wait for file to be changed } continue{ #if there were some changes in file $newsize= -s "$file"; @change=$newsize-$oldsize; if ($change[0]!=0){ print "The file has been changed"; } } close FD;

The file is in a plain text format, such as:

1277435278 1277435343 1277435382 dee djennga dega denga ddenga ddjeig deng djeng ddeng

So,is there another method can I do this work in a better way? Any suggestions will be appreciated!

Replies are listed 'Best First'.
Re: Seeking a better way to monitor a file's change
by ikegami (Patriarch) on Jun 25, 2010 at 18:08 UTC
Re: Seeking a better way to monitor a file's change
by alexbio (Monk) on Jun 26, 2010 at 11:35 UTC
Re: Seeking a better way to monitor a file's change
by xbmy (Friar) on Jun 25, 2010 at 19:12 UTC

    Thanks for your suggestion!

    I found the following code can monitor the file's delete, rename or ctreat in one directory, so, when I delete one file, it printed a message "file deleted: ...", but when I made some changes on one of the txt files in that directory and saved it, there was no message printed out, can anyone tell me what was the problem in the following codes? Or, actually the code can't monitor the change in file's size?

    Thanks in advance!

    #!/usr/bin/perl use strict; use warnings; use Carp; use File::Monitor; $| = 1; my $monitor = File::Monitor->new; push @ARGV, '.' unless @ARGV; while ( my $obj = shift ) { $monitor->watch( { name => $obj, recurse => 1 } ); } my @attr = qw( deleted mtime ctime uid gid mode size files_created files_deleted ); while ( 1 ) { sleep 1; for my $change ( $monitor->scan ) { print $change->name, " changed\n"; for my $attr ( @attr ) { my $val; if ( $attr =~ /^files_/ ) { my @val = $change->$attr; $val = join( ' ', @val ); } else { $val = $change->$attr; } if ( $val ) { printf( "%14s = %s\n", $attr, $val ); } } } }
      See File::Monitor::Delta. The module is able to monitor changes to file size.

      A file can change in many ways. What exactly would you consider a file "change"? Perhaps checking the file's modified time mtime is sufficient enough for your needs?

      If you're interested in whether the contents of the file changed, you may want to look at Digest::file.
Re: Seeking a better way to monitor a file's change
by Anonymous Monk on Jun 25, 2010 at 18:24 UTC
    md5sum minicom.log >>CHANGED? && cat CHANGED\?