監視

なんか、こうログファイルの監視とか。

#!/usr/bin/perl

use strict;
use warnings;
use File::stat;

sub main
{
    my $pattern = shift;
    my %file_size;

    if (not defined $pattern) {
	$pattern = '*';
    }

    for my $file (glob $pattern) {
	if (-f $file) {
	    my $st = stat $file or die $!;
	    $file_size{$file} = $st->size;
	}
    }

    while (1) {
	for my $file (glob $pattern) {
	    next if not -f $file;
	    my $st = stat $file or die;

	    if (not exists $file_size{$file}) {
		$file_size{$file} = 0;
	    }

	    if ($st->size > $file_size{$file}) {
		$file_size{$file} = read_to_eof($file, $file_size{$file});
	    }
	    elsif ($st->size < $file_size{$file}) {
		$file_size{$file} = read_to_eof($file, 0);
	    }
	}

	sleep 1;
    }
}

sub read_to_eof
{
    my ($filename, $offset) = @_;
    open my $fh, '<', $filename or die;
    binmode $fh;
    seek $fh, $offset, 0;

    my $n = 0;
    my $total = 0;
    my $str;

    do {
	$n = read $fh, $str, 1024 * 1024;
	print $str;
    }
    while ($n > 0);

    my $cur = tell $fh;
    close $fh;

    return $cur;
}

main @ARGV;