Thread Datenstrom in Realtime mitlesen: tcpdump über Pipe an Perlscript übergebn (5 answers)
Opened by Gast at 2007-01-02 14:17

dino03
 2007-01-05 08:41
#37429 #37429
User since
2007-01-04
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi sid burn !

Konnte dir leider nicht so schnell antworten. Leichte
Login/Registrierungs-Probleme auf dem Board gehabt.
(Die helfen einem hier echt schnell! Nochmal besten Dank an Renee)

Zu meinem Problem ...

Ne Sekunde Unterschied wär ja vertretbar. Vor allem, weil ich das Lesen
der Log-Dateien auch auf 3sec.-Zyklus (mit File::Tail) gestellt habe.
Das was bei mir auftritt sind aber teilweise 20-30sec oder noch länger
(je nach Datenmenge). Das ist nicht mehr vertretbar.

Identisches Problem hatte ich bei einem Überwachungsscript von nem
FTP-Server. Die Logs, die das Script geschrieben hat sind erst nach
20-30sec in der Datei erschienen (das kann nicht an tail -f liegen).
Das konnte ich dann folgendermassen erzwingen:
Code: (dl )
1
2
3
4
open (LOGDATEI, ">>${logdat}") or die("Dateifehler!");                  # Log-Datei öffnen zum schreiben
$old_fh = select(LOGDATEI); # siehe perlfaq5 (How do I flush/unbuffer an output filehandle? Why must I do this?)
$| = 1; # Perl anweisen, die Schreiboperation auf die Logdatei nicht zu buffern
select($old_fh); # sondern direkt auszufuehren

Das identische Problem tritt beim Schreiben der Daten von tcpdump in die
named Pipe auf, nur das ich so eine Variable und Perl-Code natürlich
bei tcpdump nicht habe. Bei ner älteren SuSE (ich glaube 8.2) lief das
alles ohne Probleme. Irgendwann so zwischen 9.x und 10.1 muß sich da
was geändert haben. Bei ner 9.2 habe ich das mit dem
FTP-Überwachungsscript.

Ich habe schon die gesammte man bash durchgesucht, mit apropos alles
gurchgewühlt was irgendwie mit buffer, file oder flush war und meine
O&´Reilly-Bücher durchgeblätter (Linux in a Nutshell, Perl Kochbuch, Perl
Programmierung, ...) alles nix.

In nem anderen Script lief das bis jetzt so ...
Code: (dl )
1
2
3
4
open (LOGPIPE, $pipename) || print "konnte $pipename nicht oeffnen\n";
while (<LOGPIPE>) # Zeilen lesen
{
my $logline = $_; # Zeile sichern

Einfachste Art, Eingabedaten aus ner Pipe zu lesen.
Mit dem Script habe ich mit tcpdump gelesen und das Transfervolumen
einzelner Rechner Richtung Internet aufsummiert.

Meiner Meinung nach muß das Problem an der Pipe und tcpdump oder
der Shell aus dem das startet liegen. Ich weiß aber nicht mehr weiter.
Ich laß mich aber auch gerne belehren ;-)

Gruß
Bernd

View full thread Datenstrom in Realtime mitlesen: tcpdump über Pipe an Perlscript übergebn