Überprüfen auf Prozessen und Dateien
Markus
- perl
Hallo ;),
Irgendwie will bei mir nichts hinhauen.
Ich habe ein Skript (AZ.pl), welches je nach Situation mehrmals gleichzeitig gestartet werden kann. (Das Skript AZ.pl befindet sich in einer Batch-Datei und diese wird unter Umständen mehrfach gestartet) Dieses Skript bearbeitet Dateien in einem bestimmten Verzeichnis. Nun will ich sicherstellen, dass wenn AZ.pl momentan schon 1x läuft, dass das zweite, dritte usw. AZ.pl-Skript erst anfängt, wenn das erste fertig, dann das zweite usw. ist und immer die nachfolgend gestarteten Batch-Dateien "warten".
Wie kann ich in Perl auf einen Prozess prüfen ob er schon läuft?
Wenn ja, dann soll er sleep 10; machen und dann nochmal überprüfen, wenn das Skript AZ.pl nicht mehr läuft kann ein weiteres gestartet werden.
Problem, was ist wenn zufällig gleichzeitig zwei AZ.pl starten wollen? Gibt es da irgendwas damit sicher immer nur 1x AZ.pl läuft?
An einer anderen Stelle gibt es fast den gleichen Fall.
Es wird ein Skript ausgeführt mit dem Namen Work.pl. Dieses Skript kopiert zuerst die zu bearbeitenden Dateien (z.B. Haus01.10.2008) und benennt die Kopien genau gleich mit einem x davor (z.B. xHaus01.10.2008). Dient um aus den Dateien mit x zu lesen und wieder eine neue Datei mit dem alten Namen zu schreiben. Am Ende werden alle Dateien mit x am Anfang gelöscht. Das zweite Work.pl Skript soll erst dann anlaufen, wenn es keine Datei mehr gibt, die mit x beginnt.
Auch wenn beim zweiten, dritten Work.pl Skript keine Änderungen vorgenommen werden, sondern Sie nur zum Check nochmals "drüber laufen" müssen sie warten.
Hier mal der Kuddelmuddel den ich bis jetzt gemacht habe am Anfang des Skriptes.
opendir (CHECK, $verz);
$wert = "0";
do {
@stop= grep { $_=~(/(^xHaus|^xHgu)(.*)(.csv)$/) } readdir(CHECK);
foreach (@stop){
if ($_=~(/(^xH)(.*)(.csv)$/)){
sleep 10;
}
else {
$wert = "1";
}
}
} until ($wert eq "1");
closedir(CHECK);
Aber irgendwie will die Schleife bei mir nicht solange gehen, solange eine Datei mit x existiert, sondern nur 1x und dann macht das Programm weiter. Irgendwie hab ich voll das Blackout gerade eben >.<.
Wäre super wenn mir hier jemand Vorschläge oder Tips geben kann.
Falls sich jemand meldet, vielen Dank.
mfg
Markus
Wäre super wenn mir hier jemand Vorschläge oder Tips geben kann.
Siechfred
Wäre super wenn mir hier jemand Vorschläge oder Tips geben kann.
Siechfred
Danke, aber leider nicht in der Umgebung möglich in der ich arbeite.
Ich hab keine Möglichkeit LockFolder.pm anzulegen. Jedenfalls nicht bis April. Aber ich probiers trotzdem mal ob ich mit flock auf alle Dateien zu nem besseren Ergebnis komme.
Wäre super wenn mir hier jemand Vorschläge oder Tips geben kann.
Hast du dir das Skript mal angeschaut?
Ich hab den Blog zwar in meiner Liste, der Schreiber ist aber vermutlich Anfänger und viele Beispiele und Skripte sind extrem verbesserungswürdig (bis untauglich). In diesem Fall ist es z.b. die Prüfung auf ein Verzeichniss:
if ($directory eq ''){die "Directory does not exists: $directory";}
Dazu existiert -d und wenn er nur auf einen Lerstring überprüfen wollte, reicht i.d.R. !$directory
Dann ist der ganze Ablauf seltsam, er legt eine flock Datei an und öffnet sie mit einem flock. Einfacher und sicherer würde es gehen, in einem gegenläufigen Prozess nur auf die Existenz der Datei zu testen und stattdessen die lock Datei am Ende löschen (z.b. in DESTROY).
Struppi.