Akela: Dateilock prüfen

Hallo,

wie kann ich mit Perl feststellen, ob eine Datei gelockt ist ?
Ich benötige diese Info, damit ich bsw. eine Datei nicht schon
anpacke, bevor diese fertig kopiert oder bearbeitet ist.

ciao Andreas

  1. Hell-O!

    wie kann ich mit Perl feststellen, ob eine Datei gelockt ist?

    Wozu? Wenn flock verfügbar ist, gibt es zwei Möglichkeiten:

    Exklusiv: Alle Prozesse warten, bis der aktuelle Prozess den Dateizugriff beendet hat.
    Shared: Alle Prozesse teilen sich rein, was bei Schreibvorgängen kritisch sein könnte.

    Ich benötige diese Info, damit ich bsw. eine Datei nicht schon anpacke, bevor diese fertig kopiert oder bearbeitet ist.

    Dann setze sie während der Bearbeitungszeit auf LOCK_EX. Nähere Infos zum Locking gibt's in perlopentut.

    Siechfred

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)
    Kabelkuddelmuddel || Steuerfreie Geburtsbeihilfen?  || RT 221 Erfurt-Altstadt i.V.
    1. Hallo Siechfred,

      mit flock(HND, LOCK_EX) würde ich ja den Dateistatus beeinflussen. Ich möchte den Status aber nur Abfragen.

      Den Status setzte ich nicht selbst aus meinem Skript heraus. Meine Intension ist die, zu ermitteln, ob eine Datei von einem anderen Prozeß gesperrt ist (z.B. kopieren, Bearbeitung durch anderen Benutzer usw.)

      ciao Andreas

      1. Hell-O!

        Meine Intension ist die, zu ermitteln, ob eine Datei von einem anderen Prozeß gesperrt ist (z.B. kopieren, Bearbeitung durch anderen Benutzer usw.)

        Hm, mit LockFile::Simple kannst du herausbekommen, ob eine Datei aktuell gelockt ist. Ansonsten kannst du einen Fehler auch auf die übliche Art und Weise abfangen:

        flock(FH, LOCK_EX) || die "Can't flock: $!";

        Vielleicht hat ja jemand noch eine andere Idee, wenngleich ich noch nicht so recht verstehe, wozu du diese Info brauchst.

        Siechfred

        --
        Ich bin strenggenommen auch nur interessierter Laie. (molily)
        Kabelkuddelmuddel || Steuerfreie Geburtsbeihilfen?  || RT 221 Erfurt-Altstadt i.V.
        1. Hallo,

          unter LockFile::Simple finde ich leider auch keine Funktion, die NUR prueft, ob ein File gesperrt ist.

          Ich benoetige das fuer folgendes:
          Eine Datei wird von einem externen Programm in mein
          Verzeichnis geschrieben oder kopiert. Diese neue Datei
          kann ich natürlich erst mit meinem Skript verarbeiten,
          wenn sie sauber geschrieben wurde. Ein Zugriff inmitten
          eines Kopiervorgangs wäre da nicht so clever. Da das
          Betriebssystem den Zugriff daher normalerweise locked,
          wollte ich einfach den lock-Status abfragen. Wenn
          ich einen flock auf eine Datei mache und dies erfolgreich
          war, müsste ich danach gleich wieder ein unlock ausführen.
          Das halte ich für unnötig. Einen open könnte ich zwar auch
          versuchen aber das ist mir zu unsauber. Mir würde was in
          der Art chk_lock( $filename ) vorschweben um den lock-
          Status der Datei zu ermitteln.

          ciao Andreas

          1. unter LockFile::Simple finde ich leider auch keine Funktion, die NUR prueft, ob ein File gesperrt ist.

            Reicht dir trylock nicht aus?

            Siechfred

            --
            Ich bin strenggenommen auch nur interessierter Laie. (molily)
            Kabelkuddelmuddel || Steuerfreie Geburtsbeihilfen?  || RT 221 Erfurt-Altstadt i.V.
            1. Hallo,

              unter LockFile::Simple finde ich leider auch keine Funktion, die NUR prueft, ob ein File gesperrt ist.

              Reicht dir trylock nicht aus?

              trylock würde die Datei doch auch sperren, wenn er erfolgreich ist.
              Ich will diese Datei aber nicht sperren.

              ciao Andreas

              1. Hell-O!

                trylock würde die Datei doch auch sperren, wenn er erfolgreich ist.

                Dann musst du sie halt gleich wieder entsperren.

                Ich will diese Datei aber nicht sperren.

                Du kannst mit Perl m.W.n. nicht herausbekommen, ob eine Datei gesperrt ist, ohne dass man selber versucht, sie zu sperren. Das Einzige, was dir bleibt, ist LOCK_NB:

                open FH, $datei;  
                if(flock FH, LOCK_EX | LOCK_NB) {  
                  close FH;  
                  print "$datei ist bereit";  
                }  
                else {  
                  print "$datei ist gesperrt";  
                }
                

                Verwendest du LOCK_NB nicht, wartet flock so lange, bis die Datei durch den Prozess wieder freigegeben wurde. Und das ist es doch, was du willst, oder?

                Siechfred

                --
                Ich bin strenggenommen auch nur interessierter Laie. (molily)
                Kabelkuddelmuddel || Steuerfreie Geburtsbeihilfen?  || RT 221 Erfurt-Altstadt i.V.
                1. Du kannst mit Perl m.W.n. nicht herausbekommen, ob eine Datei gesperrt ist, ohne dass man selber versucht, sie zu sperren. Das Einzige, was dir bleibt, ist LOCK_NB:

                  Schade :-(

                  Verwendest du LOCK_NB nicht, wartet flock so lange, bis die Datei durch den Prozess wieder freigegeben wurde. Und das ist es doch, was du willst, oder?

                  Das ist nicht ganz das, was ich will, kommt dem aber schon recht nahe. Ich werde jetzt einfach meine Programmlogik überarbeiten. Denke dann komme ich am besten zu Potte.

                  Danke für Deine Geduld :-)

                  ciao Andreas

          2. Ich benoetige das fuer folgendes:
            Eine Datei wird von einem externen Programm in mein
            Verzeichnis geschrieben oder kopiert. Diese neue Datei
            kann ich natürlich erst mit meinem Skript verarbeiten,
            wenn sie sauber geschrieben wurde. Ein Zugriff inmitten
            eines Kopiervorgangs wäre da nicht so clever. Da das
            Betriebssystem den Zugriff daher normalerweise locked,
            wollte ich einfach den lock-Status abfragen. Wenn
            ich einen flock auf eine Datei mache und dies erfolgreich
            war, müsste ich danach gleich wieder ein unlock ausführen.

            Wenn die Datei gelockt wird kann kein zweiter Prozess die Datei nochmal locken, dass dist doch der Sinn davon.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Hallo,

              ich will die Datei doch gar nicht locken, auch
              nicht um den lock zu testen.

              ciao Andreas

  2. Hallo,

    ich glaube ich habe was ich brauche :-)

    IO::LockedFile->have_lock( )

    Danke für Eure Mühe.

    ciao Andreas

    1. Hell-O!

      ich glaube ich habe was ich brauche :-)

      Das glaube ich nicht.

      IO::LockedFile->have_lock( )

      Doku zu have_lock:
      "Note that this will not tell us anything about the situation of the file itself - thus we should not use this method in order to check if the file is locked by someone else."

      Wenn dein Script also keine Kontrolle über die Datei hat, hilft dir IO::LockedFile->have_lock() kein Stück weiter.

      Siechfred

      --
      Ich bin strenggenommen auch nur interessierter Laie. (molily)
      Kabelkuddelmuddel || Steuerfreie Geburtsbeihilfen?  || RT 221 Erfurt-Altstadt i.V.
      1. Hallo,

        Wenn dein Script also keine Kontrolle über die Datei hat, hilft dir IO::LockedFile->have_lock() kein Stück weiter.

        das habe ich dann auch bemerkt. War in meiner Euphorie vernebelt :-(

        ciao Andreas

        1. das habe ich dann auch bemerkt. War in meiner Euphorie vernebelt :-(

          Was spricht denn gegen flock und unlock?

          Struppi.

          --
          Javascript ist toll (Perl auch!)
          1. das habe ich dann auch bemerkt. War in meiner Euphorie vernebelt :-(

            Was spricht denn gegen flock und unlock?

            Struppi.

            Hallo Struppi,

            in den man-pages steht, daß sich flock je nach BeSy unterschiedlich verhält.

            ciao Andreas

            1. in den man-pages steht, daß sich flock je nach BeSy unterschiedlich verhält.

              Meinst du die Konstanten die werden in Fcntl defniert.
              Oder allgemein?
              Dann kommst du auf dem Weg sowieso nicht weiter, da z.b. Win95 kein Dateilock kann.

              Die Frage wäre was du wirklich erreichen willst?

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. Hallo Struppi,

                ich habe es jetzt mit flock versucht. Scheint zu funktionieren.

                Meinst du die Konstanten die werden in Fcntl defniert.

                Die habe ich eingebunden.

                Oder allgemein?
                Dann kommst du auf dem Weg sowieso nicht weiter, da z.b. Win95 kein Dateilock kann.

                Win95 -> wer benutzt denn sowas ;-)
                Auf Windows NT und höher scheint das zu funktionieren. Ich gehe jetzt mal ganz naiv davon aus, daß dies unter UNIX/Linux sowieso funktioniert.

                Die Frage wäre was du wirklich erreichen willst?

                Mittlerweile bin ich nach einigen Tests gar nicht mehr so sicher ob mir ein Test auf Lock wirklich was bringt. Ich bin davon ausgegangen, daß bei einem Filecopy durch ein externes Programm, die Datei gelocked wird. Scheinbar ist das nicht der Fall, da ich ein im kopieren befindliches File sperren kann. Genau das will ich ja nicht.

                Muß das Filehandle für flock readwrite geöffnet sein oder reichen hier Leserechte beim Öffnen?

                Ich verwende jetzt folgenden Code.

                 #-----------------------------------------------------------------------------  
                sub lock_status  
                #-----------------------------------------------------------------------------  
                  {  
                    my ( $filename ) = @_;  
                    my $status = -1;  
                  
                      # Prüfen auf Existenz  
                      if( !( -e $filename ) )  
                        {  
                          $status = 1;  
                        }  
                      # Prüfen auf lock  
                      elsif( open( HNDfile, "+<$filename" )  )  
                        {  
                            # Datei test-locken  
                            if( flock( HNDfile, LOCK_EX | LOCK_NB ) )  
                              {  
                                $status = 0;  
                                flock( HNDfile, LOCK_UN );  
                              }  
                            else  
                              {  
                                $status = 3;  
                              }  
                          close( HNDfile );  
                        }  
                      else  
                        {  
                          $status = 2;  
                        }  
                    return( $status );  
                  }  # lock_status()  
                
                

                wenn ich beim Dateiöffnen aber statt +< ein < verwende erkennt die Funktion nicht, daß die Datei verwendet wird.

                ciao Andreas

                1. Meinst du die Konstanten die werden in Fcntl defniert.

                  Die habe ich eingebunden.

                  Oder allgemein?
                  Dann kommst du auf dem Weg sowieso nicht weiter, da z.b. Win95 kein Dateilock kann.
                  Win95 -> wer benutzt denn sowas ;-)

                  ich ;-)

                  Auf Windows NT und höher scheint das zu funktionieren. Ich gehe jetzt mal ganz naiv davon aus, daß dies unter UNIX/Linux sowieso funktioniert.

                  sicher.

                  Die Frage wäre was du wirklich erreichen willst?

                  Mittlerweile bin ich nach einigen Tests gar nicht mehr so sicher ob mir ein Test auf Lock wirklich was bringt. Ich bin davon ausgegangen, daß bei einem Filecopy durch ein externes Programm, die Datei gelocked wird. Scheinbar ist das nicht der Fall, da ich ein im kopieren befindliches File sperren kann. Genau das will ich ja nicht.

                  Ich vermutete schon sowas. Die Frage ist was ist kopieren?

                  Muß das Filehandle für flock readwrite geöffnet sein oder reichen hier Leserechte beim Öffnen?

                  hmmm...

                  Ich verwende jetzt folgenden Code.

                  [Du verwendest den gleichen Stil wie ich]

                  wenn ich beim Dateiöffnen aber statt +< ein < verwende erkennt die Funktion nicht, daß die Datei verwendet wird.

                  Kann es sein dass ein LOCK_EX keinen Sinn bei einer Datei die du nur zum lesen öffnest? Evtl. ist das der Grund (ich weiß es nicht sitze grad an meiner Win95 Mühle ;-) )

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
                  1. Hallo,

                    ich ;-)

                    Du armer ;-)

                    Ich vermutete schon sowas. Die Frage ist was ist kopieren?

                    Ich überwache mit dem Perlskript ein Verzeichnis. Wenn neue Dateien hinzukommen, werden diese je nach Namen in verschiedene Queues verschoben. Verschieben kann ich natürlich nur, wenn die Dateien vollständig geschrieben wurden. Mit kopieren meine ich hier, daß irgendein externes Programm diese Dateien in mein überwachtes Verzeichnis stellt.

                    [Du verwendest den gleichen Stil wie ich]

                    Mein Chef findet den furchtbar.

                    ciao Andreas

                    1. ich ;-)
                      Du armer ;-)

                      auf einen P100, den hab ich jetzt seit ca. 8 Jahren, muss mich mal um nen neuen kümmern

                      Ich vermutete schon sowas. Die Frage ist was ist kopieren?
                      Ich überwache mit dem Perlskript ein Verzeichnis. Wenn neue Dateien hinzukommen, werden diese je nach Namen in verschiedene Queues verschoben. Verschieben kann ich natürlich nur, wenn die Dateien vollständig geschrieben wurden. Mit kopieren meine ich hier, daß irgendein externes Programm diese Dateien in mein überwachtes Verzeichnis stellt.

                      und da denke ich dass es die Frage ist, ob das Programm die Datei lockt, dass passiert ja nicht von selbst. wie du schon gemerkt hast ist das nciht unbedingt selbstverständlich.

                      [Du verwendest den gleichen Stil wie ich]
                      Mein Chef findet den furchtbar.

                      ich find's übersichtlich, aber seh den auch eher selten - ich find oft den Stil in den CPAN Modulen furchtbar.

                      Struppi.

                      --
                      Javascript ist toll (Perl auch!)
  3. Hey,
    Dateien werden nicht gelockt, wenn sie kopiert werden oder in Bearbeitung sind. Wenn du möchtest, dass das passiert, damit du es in deinem Programm abfragen kannst, musst du es zusätzlich ins erste Kopier- bzw. Bearbeitungsprogramm einbauen. (Das ist natürlich nicht praktikabel.)

    Um dein eigentliches Problem zu lösen, prüfe auf einen der drei Zeitstempel der Datei, ich weiß grade nicht aus dem Kopf, welchen. http://perldoc.perl.org/File/stat.html
    Wenn dieses gewisse Alter größer als zwei Sekunden ist, wurde die Datei fertig geschrieben und du kannst sie gefahrlos anpacken und weiterverarbeiten.

    --
    水-金-地-火-木-土-天-海-冥