Julian Hofmann: Counter wird auf Null gesetzt. Warum?

Hallo liebe Leute,

anfangs dachte ich mir "Dumm gelaufen" als zum ersten Mal mein Counter (auf eigenem Server) unerklärlicherweise auf Null zurückgesetzt war. Nachdem inzwischen aber der Counter fast alle zwei Wochen neustartet muß wohl irgendwo der Wurm drin sein.
Der Counter wird via SSI aufgerufen und wöchentlich 300-400 Mal aufgerufen.

Welche Gründe könnte es geben, daß sich untenstehendes Skript den Counter selbst neustartet? Kann es durch den gleichzeitigen Aufruf mehrerer User kommen? Und wenn ja: Wie kann ich das vermeiden?

<schnipp>

#!/usr/bin/perl

Festlegen von Variablen und Datenquellen

$counterfile = "counter.txt";
   $neu = "0";

Einlesen der Linkdaten aus Datenbank-Datei

open(COUNTER, "<$counterfile") die "Datei nicht gefunden\n";
   while(<COUNTER>)
        {
          push(@counter,$_);
        }
   close(COUNTER);
    
   $neu = $counter[0] += "1";
#  Schreiben des neuen Zählerstandes
   open(COUNTER, ">$counterfile") die "Datei nicht gefunden\n";
   print COUNTER "$neu";
   close(COUNTER);

print "Content-type: text/html\n\n";
   print "$neu Zugriffe seit 20. Juni 1999";

</schnipp>

Vielen Dank für Eure Hilfe.

Grüße aus Bayreuth
Julian

  1. hallo julian

    ich bin jetzt nicht grad der guru in sachen filehandling auf servern, aber ich könnte mir schon vorstellen, dass es bei mehreren nutzern probleme geben könnte...

    such mal im perlman nach den funktionen lock() und unlock()

    die sperren ein file kurzfristig und lassen es dann wieder frei (ääh sehr blumig ausgedrückt *g*)

    das muss aber von deinem betriebssystem unterstützt werden...
    ansonsten gibt es auch noch andere funktionen unabhängig vom bs auf dem www

    hoffe du kannst was damit anfangen

    schönes wochenende
    mfg
    Siramon

    */* jetzt mit self-visitenkarte */*

    1. Hallo,
      als kleine Ergänzung http://www.boutell.com/openfaq/cgi/25.html zum Thema FileLock... interessant ist der 2. Weg der da beschrieben ist, der funktioniert auch unter NT.

      Prinzip: Jeder Prozess schaut ob ein bestimmtes file (lockfile) existiert, wenn nicht, wird ein lockfile angelegt {hier folgen dann die kritischen Statements wie Scheibzugriffe}.... und am Ende des Prozesses wieder gelöscht. Existiert ein lockfile - wartet der Prozess...

      Viele Grüße, Rolf

      1. Hallo Rolf,

        Prinzip: Jeder Prozess schaut ob ein bestimmtes file (lockfile) existiert, wenn nicht, wird ein lockfile angelegt {hier folgen dann die kritischen Statements wie Scheibzugriffe}.... und am Ende des Prozesses wieder gelöscht. Existiert ein lockfile - wartet der Prozess...

        So eine Idee hatte ich auch mal ... Dann stellte ich mir die Frage, was wohl passiert, wenn zwei Prozesse "gleichzeitig" sehen, daß die Lock-Datei nicht existiert - dann könnten beide Zeitgleich in den kritischen Abschnitt wollen :(. Beim erzeugen einer Datei muß ich ja nicht unbedingt merken, daß diese Datei schon existiert. Ich habe für diesen Fall die Logik umgedreht, und bin davon ausgegangen, daß es nur ein Prozess schaffen wird, die Datei zu LÖSCHEN. Unabhängig davon, wieviele sich per unlink auf die Datei stürzen.

        Gruß,
           Jörk

        1. Hi,

          So eine Idee hatte ich auch mal ... Dann stellte ich mir die Frage, was wohl passiert, wenn zwei Prozesse "gleichzeitig" sehen, daß die Lock-Datei nicht existiert - dann könnten beide Zeitgleich in den kritischen Abschnitt wollen :(.

          genau darum gibt es flock.

          perldoc -f flock

          Cheatah

    2. Hi,

      such mal im perlman nach den funktionen lock() und unlock()

      genauer:

      perldoc -f flock
      perldoc perlopentut

      Cheatah