Archiv verlassen und diese Seite im Standarddesign anzeigen : Datei überwachen ala tail -f - Wie?
Hallo,
ich möchte gerne eine Datei permanent überwachen und Veränderungen dann durch das ein Script (bevorzugt in Perl) verarbeiten lassen.
Die Funktionsweise entspricht grundlegend tail -f.
Aber wie mache ich das am besten.
Die Datei permanent zum lesen Öffnen oder lieber in kurzen Abständen immer wieder öffnen und nachprüfen?
Thovan
Moin,
ich habe von Perl keine Ahnung und bin bekennender Windowsianer, aber ganz intuitiv würde ich folgendes vorschlagen:
Wenn Dein benutztes Dateisystem ein Last-Modified-Attribut unterstützt, dann überwache nicht in erster Linie die Datei selbst, sondern dieses Datei-Attribut und öffne die Datei nur, wenn es auch wirklich Änderungen gab.
Ich vermute mal, dass der Prozess, der die Datei verändert, die nach jedem Schreibvorgang (oder zumindest in regelmäßigen Abständen) auch wieder schließt, so dass die Datei-Attribute aktualisiert werden, ansonsten ist mein Vorschlag natürlich sinnlos...
So long,
Liberty
peschmae
13-04-2007, 18:35
Das Werkzeug der Wahl wäre da wohl FAM (FAM wie in SGI FAM (http://oss.sgi.com/projects/fam/) oder Gamin (http://www.gnome.org/~veillard/gamin/)).
Perl-Bindings gibts auch. (http://search.cpan.org/~jglick/SGI-FAM-1.002/lib/SGI/FAM.pm)
Das ganze hab ich aber noch nie selber benutzt (als Entwickler meine ich, als Anwender natürlich unbewusst andauernd).
MfG Peschmä
anda_skoa
13-04-2007, 18:41
Oder mit inotify http://www.edoceo.com/creo/inotify/perl-inotify.php
bzw http://iwatch.sourceforge.net/
Ciao,
_
Matzetronic
11-05-2007, 07:59
Hi,
versuchs mal damit. Ist die entsprechende Funktion aus meinem Script zur Log-Überwachung mit RegEx und muss natürlich noch umgebastelt werden....
sub tailf_re {
my $logfile = "/var/log/mail.info";
my $re;
my $offset = -s $logfile;
my $line;
my $matched;
while() {
sleep 5;
$| = 1;
if ((-s $logfile) < $offset) {
# log rotated !?
$offset = 0;
}
open(LOG, $logfile) || print STDERR "Error opening $logfile: $!\n";
if (seek(LOG, $offset, 0)) {
# ok, log not rotated
}
else {
# log rotated
$offset=0;
seek(LOG, $offset, 0);
}
while ($line = <LOG>) {
$line =~ s/[\r\n]+//g;
$matched = 0;
foreach (keys %RE_nomatch) {
if ($line =~ $RE_nomatch{$_}) {
$matched = 1;
last;
}
}
if ($matched) { next };
$matched = 0;
foreach (keys %RE_match) {
if ($line =~ $RE_match{$_}) {
&logger("ALERT ===> " . $line);
$matched = 1;
last;
}
}
if (! $matched) {
&logger("INFO ===> " . $line);
}
}
$offset=tell(LOG);
close LOG;
}
}
Gruß,
Matze
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.