Hallo,
ich weiss nicht genau, wie ich es anstellen soll, vielleicht könnt ihr mir helfen:
Eine Applikation (perl) schreibt mehr oder weniger häufig Files auf die lokale Platte. Diese Files werden dumpf via cron/scp auf eine andere Maschine kopiert. Die lokalen Files werden nur in grösseren Abständen gelöscht, so das mit der Zeit eine immer grössere Datenmenge kopiert werden muss. Das soll sich nun ändern. Ich will unmittelbar nach einem erfolgreichen SCP das lokale File löschen. Ich muss jedoch erst mal prüfen, ob das lokale File nicht gerade noch von der Applikation geschrieben wird, bevor ich es ihr unterm Ar... wegkopiere und lösche. Das soll mit einem kleinem Shellscript passieren, welches in Intervallen vom Cron aufgerufen wird. Mein Ansatz sieht so aus (pseudocode)
cd workdir; for file in * Schreiblock setzen if Lock ok: kopieren if kopieren ok: löschen Lock entfernen
Ich weiss jetzt aber nicht: - Wie und ob überhaupt lockt Perl ein File, welches gerade erzeugt wird? D-H. kann mein Lock überhaupt einen Fehler bringen, wenn das File noch in Bearbeitung ist? - Wie verwende ich flock() in einem Script, wenn ich mehr als ein Commdo dazu ausführen will?
Gibt es einfache (!) Alternativen zu meinem Vorgehen?
Mit freundlichen Grüßen
Jens Puruckherr
Quoting Jens Puruckherr jpuruckherr@cyberport.de:
Gibt es einfache (!) Alternativen zu meinem Vorgehen?
Vielleicht machst du es so ähnlich wie Maildir...
Du schreibst die Daten in deinem Perlscript erstmal in eine Datei, die noch nicht den finalen Namen hat (oder legst sie in ein Unterverzeichnis).
Wenn du in Perl dann fertig bist, machst du einfach ein ,,mv'' auf den endgültigen Namen, das ist atomar.
Damit bräuchtest du dich nicht ums Locking kümmern...
Marcus
Jens Puruckherr jpuruckherr@cyberport.de (Mo 14 Jan 2008 10:02:20 CET):
Das soll sich nun ändern. Ich will unmittelbar nach einem erfolgreichen SCP das lokale File löschen. Ich muss jedoch erst mal prüfen, ob das lokale File nicht gerade noch von der Applikation geschrieben wird, bevor ich es ihr unterm Ar... wegkopiere und lösche. Das soll mit einem kleinem Shellscript passieren, welches in Intervallen vom Cron aufgerufen wird. Mein Ansatz sieht so aus (pseudocode)
cd workdir; for file in * Schreiblock setzen if Lock ok: kopieren if kopieren ok: löschen Lock entfernen
Ich weiss jetzt aber nicht:
- Wie und ob überhaupt lockt Perl ein File, welches gerade erzeugt
wird? D-H. kann mein Lock überhaupt
Ein open() in Perl macht auch nur fein fopen(3), und das lockt erstmal gar nix.
Das was Marcus schrieb, ist ok (tempfile und dann rename(2). Wichtig ist, daß es rename(2) ist, denn das ist atomar, ein mv(1) nicht zwingend).
rename(3pl) ist m.W. genau das rename(2).
- Wie verwende ich flock() in einem Script, wenn ich mehr als ein
Commdo dazu ausführen will?
use Fatal qw(open flock); use Fcntl qw(:flock); open(my $fh, $filename); flock($fh, LOCK_EX); .... flock($fh, LOCK_UN); # (oder $fh einfach wegschmeissen)
perldoc -f flock
lug-dd@mailman.schlittermann.de