Dateilock prüfen
Akela
- perl
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
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
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
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
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
unter LockFile::Simple finde ich leider auch keine Funktion, die NUR prueft, ob ein File gesperrt ist.
Reicht dir trylock nicht aus?
Siechfred
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
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
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
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.
Hallo,
ich will die Datei doch gar nicht locken, auch
nicht um den lock zu testen.
ciao Andreas
Hallo,
ich glaube ich habe was ich brauche :-)
IO::LockedFile->have_lock( )
Danke für Eure Mühe.
ciao Andreas
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
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
das habe ich dann auch bemerkt. War in meiner Euphorie vernebelt :-(
Was spricht denn gegen flock und unlock?
Struppi.
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
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.
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
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.
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
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.
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.