Claus Jul Larsen <cjl@steria.dk> wrote:
>> Jeg mente ikke det var supporteret - men lidt kiggen på nettet viser
>> at det er. Jeg har testet det og:
>>
>> Med LOCK_EX venter instans 2 på at den første er færdig.
>> Med LOCK_EX+NB returnerer den med fejl.
>>
>> Så det lader jo til at fungere fint. FYI.
>
>Er det noget til Perl? Der står ikke noget perl kode der. Men som jeg
>kan se ud fra diskussionen, så bliver det for svært?
Problemet med at lock-filen bremser scriptet hvis serveren har været
rebootet løses ved at bruge perls flock funktion. Det tester godt nok
ikke processer på OS-niveau men du kan lave dit script således at det
afslutter hvis der allerede kører en instans. Det smarte i forhold til
første forslag er at "låsen" forsvinder hvis serveren rebootes.
open (FOO, ">instans.lock") or die();
flock (FOO, 2+4) or die();
print "Hello World\n";
sleep 1000;
flock (FOO, LOCK_UN);
close FOO;
Prøv at starte det flere gange. Nr. 2 instans burde afslutte uden at
skrive Hello World. Hvis du ønsker at flock skal vente på den første
instans så brug flock 2 istedet. Hvis du ønsker at bruge LOCK
konstanterne så brug:
use Fcntl ':flock';
og læs perldoc -f flock
P.S.
Hvorfor er det lige at LOCK_EX + LOCK_NB returnerer værdien af EX og
ikke summen? F.eks. virker det ikke at skrive:
flock (FOO, LOCK_EX+LOCK_NB);
--
Lars Kim Lund
http://www.net-faq.dk/