Daniel: Problem experten sind gefragt!

Hallo,

ich habe ein Problem.

Ich habe 2 Scripte (Perl) der eine liegt auf Server x der ander liegt zusammen mit einer Datenbank auf Server y. Nun muss mein Script das auf dem Server x liegt auf Server y zugreifen und die Datenbank auslesen und bei bedarf veraendern und auf dem Server wieder abspeichern. Jedoch verandert der Script der auf y liegt auch die Datenbank in unregelmaesigen abstaenden. Wie kann ich eine Verbindung vom Server x zu Server y herstellen, bei dem der Script der auf x liegt auch schreiben kann, und die Datei solange schreibgeschuetzt ist, bis der Script zuende geschrieben hat.

Wie kann ich das am besten loesen?

Ich hoffe das mir jemand eine Loesung geben kann.

Schon mal Danke im Voraus.

MFG

Daniel

  1. Hallo Daniel

    ich habe ein Problem.

    Wer hat das nicht ;-)

    Ich habe 2 Scripte (Perl) der eine liegt auf Server x der ander liegt zusammen mit einer Datenbank auf Server y. Nun muss mein Script das auf dem Server x liegt auf Server y zugreifen und die Datenbank auslesen und bei bedarf veraendern und auf dem Server wieder abspeichern. Jedoch verandert der Script der auf y liegt auch die Datenbank in unregelmaesigen abstaenden. Wie kann ich eine Verbindung vom Server x zu Server y herstellen, bei dem der Script der auf x liegt auch schreiben kann, und die Datei solange schreibgeschuetzt ist, bis der Script zuende geschrieben hat.

    Die Lösung heißt: FileLocking. Ich persönlich habe nicht die heftig großen Erfahrungen mit Filelocking und gebe hier nur ein kurzes Script zum Besten, mit dem es "auch" geht. Ich weiß, dass es da interne Funktionen in Perl gibt, die das Filelocking unterstützen (heißen sogar flock glaube ich.)

    Also dieses Script funzt auch, ist aber etwas unschön:

    while (-e "script.lock)
    {
           # warten, bis Locking-File nicht mehr existiert.
    }

    open (locking, ">script.lock");
    close (locking);

    .. Script abarbeiten

    unlink ("script.lock");

    Wie gesagt, etwas unschön, vor allem, wenn das Script mittendrin abbricht und die lock-datei weiter bestehen bleibt !!! Es ist aber ein Anfang. :-)

    Bis denne,
    Dennis

    1. while (-e "script.lock)
      {
             # warten, bis Locking-File nicht mehr existiert.
      }

      An diesem Punkt geht es schief, wenn mehrere Skripte parallel laufen.

      open (locking, ">script.lock");
      close (locking);

      Besser ist es, flock zu nutzen, wenn das Betriebssystem es unterstuetzt oder selbst dafuer sorgen, dass der lock atomar ist. Vielleicht so:

      while (! mkdir('verzeichnis', 0755)) {
         sleep 1;
      }

      Ein flock ist aber in jedem Fall zu bevorzugen. Auf keinen Fall sollte man soetwas machen:

      while (irgendwas) {
      }

      Das garantiert eine 100% CPU-Auslastung.

      Peter

  2. hallo Daniel,

    Was verstehst Du unter Datenbank?

    Wenn Du ein richtiges RDBMS (wie MySQL, ORacle, Informix, MS SQL-Server ...) verwendest, dann ist es leicht, weil dann kannst Du die Mechanismen von der Datenbank verwenden, damit das funktioniert.
    Dann ist auch der Zugriff einfach, weil die ja alle netzwerkfähig sind, und Du somit vom dem Server x per DBI auf Server y zugreifen könntest.

    Wenn Du jedoch einfache Dateien, welche auf dem Server y liegen vom Server X bearbeiten willst, dann hängt das davon ab, wie Du auf die Dateien zugreifen kannst.
    Bei direktem Zugriff, etwa über SMB oder NFS, also wenn Du die Datei am Server x mit 'open()' öffnen kannst, dann ist es auch nicht schwierig (siehe unten).
    Gibt es einen Webserver, der auf Server Y installiert ist, dann schreibe einfach ein Script, welches die Modifikationen für Dich durchführt. DAs kann dann ja so abgesichert werden, daß es nur von Server x aufgerufen werden kann.
    Gibt's auch keinen Webserver, so kannst Du in Perl deinen eigenen Server für den Server Y schreiben, welcher die Arbeit für dich erledigt. (da gibt's ein script 'minisrv.pl' welches dafür einen guten Ansatz liefert)

    Allen filebasierenden Lösungen gemeinsam sollte der Einsatz von 'flock()' sein. Damit kannst Du eben die Datei für weitere Zugriffe sperren, solange Du schreibend darauf zugreifst.

    Wie das alles genau geht, steht eigentlich in den Perl-Dokumenationen, also vermeide ich Redundanzen. (eigentlich bin ich zu faul, das alles genauer auszuführen, und wenn alles vorgekaut wird, dann macht ja das Programmieren keine SPaß mehr, oder?? ;-) )

    Viel Spaß noch
    Klaus

    PS.: und vergiß nicht 'there's more than one way, to do it'