Schrift
[thread]13138[/thread]

logfile

Leser: 3


<< >> 5 Einträge, 1 Seite
leo11
 2009-02-14 22:17
#118865 #118865
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Hallo Perlgemeinde,

folgender Code:
Code (perl): (dl )
1
2
3
4
5
6
7
8
sysopen(LOG_FILE, $logfile, O_RDWR|O_CREAT ) or die "Can't opne $logfile: $!";  #mit lese/schreibrechten öffnen, ggf neu anlegen
if (flock(LOG_FILE, &LOCK_EX)) {         # exclusive lock
    while (<LOG_FILE>) {
              print LOG_FILE $_;
    }
    flock(LOG_FILE, &LOCK_UN) or die "Can't unlock logfile $!"; # unlock
}
close(LOG_FILE) or die "Can't close logfile $!";

macht aus einer Datei in der
1
2
3
4
steht
1
1
3
3

Wieso ist das so?

Meine Absicht ist im Logfile bspw. nach der Zeile zu suchen die mit dem Key xy anfängt und in dieser Zeile rechts etwas anzuhängen. Sollte es den Key xy bisher im Logfile nicht geben, soll er an die Datei angehängt werden. Außerdem will ich dafür sorgen, dass wenn die Datei 500 Zeilen hat vorn 50 Zeilen gelöscht werden, und dass unter Berücksichtigung von konkurrierenden Prozessen. Wie kann man dazu sinnvoll vorgehen?
murphy
 2009-02-14 23:44
#118867 #118867
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Der Code liest und schreibt abwechselnd Zeilen aus und in die geoeffnete Datei. Da jeweils die gerade gelesene Zeile wieder geschrieben wird, wird in Deinem Beispiel jede zweite Zeile durch die vorhergehende ueberschrieben. Waeren die Zeilen nicht alle zufaellig gleich lang, koennte das Ergebnis auch noch wesentlich unuebersichtlicher werden.

Um die geschilderten Modifikationen an der Logdatei durchzufuehren, waere eine Loesung mit CPAN:Tie::File vermutlich am bequemsten, da sich dann alle gewuenschten Operationen mit splice, grep und Konsorten erledigen lassen.
When C++ is your hammer, every problem looks like your thumb.
pq
 2009-02-15 01:41
#118870 #118870
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
leo11+2009-02-14 21:17:08--
Code (perl): (dl )
1
2
3
4
5
if (flock(LOG_FILE, &LOCK_EX)) {         # exclusive lock
...
    flock(LOG_FILE, &LOCK_UN) or die "Can't unlock logfile $!"; # unlock
}
close(LOG_FILE) or die "Can't close logfile $!";

dazu kann ich nur sagen: das LOCK_UN ist unnötig und sogar falsch. ein close() entfernt den
lock sowieso und ausserdem kann zwischen dem unlock und dem close auch ein anderer prozess
auf die datei zugreifen, da hast du somit eine race condition drin.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
murphy
 2009-02-15 13:01
#118878 #118878
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@pq: Gab's nicht ein paar komische Betriebssysteme, wo man explizit unlocken muss, weil sonst auch ueber das Schliessen der Datei hinaus eine Sperre bestehen bleibt, die man nicht mehr so einfach los wird? Ich lgaube, das hat zumindest mal jemand hier im Forum behauptet...

Die Racecondition an dieser Stelle ist meiner Meinung nach auch nicht kritisch, wenn man vor dem unlocken alles geflusht hat, was man schreiben wollte.
When C++ is your hammer, every problem looks like your thumb.
leo11
 2009-02-15 14:11
#118879 #118879
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
So, es funktioniert nun und hat auch einem ersten Belastungstest standgehalten.
@murphy
Tie::File ist prima. Nach der Doku von File::Temp tut diese Doku richtig gut.

@pq
Danke für den Tip.
<< >> 5 Einträge, 1 Seite



View all threads created 2009-02-14 22:17.