/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Lås
Fra : Tom


Dato : 14-05-07 08:00

Jeg har et Perl script som startes fra cron.
Det må kun køre een gang.

Man kan lave en lås ved at tilgå MySQL's GET_LOCK() eller lave en shell
wrapper med flock.

Men hvad hvis jeg nu ville have en ren (og vedligeholdelsesfri) løsning i
Perl?

Nogen oplagte forslag?



 
 
Tom (14-05-2007)
Kommentar
Fra : Tom


Dato : 14-05-07 08:08


"Tom" <no@spam.please> wrote in message
news:464808af$0$90276$14726298@news.sunsite.dk...
> Jeg har et Perl script som startes fra cron.
> Det må kun køre een gang.
>
> Man kan lave en lås ved at tilgå MySQL's GET_LOCK() eller lave en shell
> wrapper med flock.
>
> Men hvad hvis jeg nu ville have en ren (og vedligeholdelsesfri) løsning i
> Perl?

Ups, havde overset at flock også finde til perl.

#!/usr/bin/perl

use Fcntl ':flock';
open LOCK, ">/tmp/test.pl.lock" or die "open: $!";
exit 2 unless flock(LOCK, LOCK_EX|LOCK_NB);

while (1)
{
sleep(5);
}


Bedre løsninger end ovenstående?

Evt. uden afhængigheder til moduler?



Peter Makholm (14-05-2007)
Kommentar
Fra : Peter Makholm


Dato : 14-05-07 08:30

"Tom" <no@spam.please> writes:

> #!/usr/bin/perl
>
> use Fcntl ':flock';
> open LOCK, ">/tmp/test.pl.lock" or die "open: $!";
> exit 2 unless flock(LOCK, LOCK_EX|LOCK_NB);
>
> while (1)
> {
> sleep(5);
> }
>
>
> Bedre løsninger end ovenstående?

Det kommer an på om flock-semantikken opfylder dine behov. Hvis den
gør det så er ovenstående nok det bedste.

> Evt. uden afhængigheder til moduler?

Ovenstående har kun afhængigheder til Fcntl der er et standardmodul og
bør derfor altid være tilgængeligt, med mindre du arbejder under meget
restriktive forhold. Alternativt kan du (måske) erstatte
'LOCK_EX|LOCK_NB' med '6'.

Et alternativ er noget ala:

#!/usr/bin/perl

use Fcntl;

$locked = sysopen($fh,"/tmp/test.pl.lock",O_RDWR|O_CREAT|O_EXCL);
exit 2 unless $locked;

do_something;

close $fh;
unlink "/tmp/test.pl.lock";


Denne form for låsning 'overlever' at processen dør, hvilket flock
ikke gør.

//Makholm

Morten Guldager (14-05-2007)
Kommentar
Fra : Morten Guldager


Dato : 14-05-07 09:04

2007-05-14 Peter Makholm wrote
>
> Et alternativ er noget ala:
>
> #!/usr/bin/perl
>
> use Fcntl;
>
> $locked = sysopen($fh,"/tmp/test.pl.lock",O_RDWR|O_CREAT|O_EXCL);
> exit 2 unless $locked;
>
> do_something;
>
> close $fh;
> unlink "/tmp/test.pl.lock";
>
>
> Denne form for låsning 'overlever' at processen dør, hvilket flock
> ikke gør.

Hmm, jeg forstår vist ikke helt hvad du mener her.

Begge eksempler slipper da låsen hvis processen dør.

Men det er måske slet ikke det du mener...?



/Morten

Peter Makholm (14-05-2007)
Kommentar
Fra : Peter Makholm


Dato : 14-05-07 10:43

Morten Guldager <Morten.Guldager@gmail.com> writes:

>> $locked = sysopen($fh,"/tmp/test.pl.lock",O_RDWR|O_CREAT|O_EXCL);
>> exit 2 unless $locked;

> Hmm, jeg forstår vist ikke helt hvad du mener her.
>
> Begge eksempler slipper da låsen hvis processen dør.

Flaget O_CREAT|O_EXCL betyder at sysopen skal lave filen hvis den ikke
findes og fejle hvis filen allerede findes. Det vil sige at 'låsen'
alene består i selve eksistensen af filen /tmp/test.pl.lock.

Det vil sige at man eksplicit skal huske at slette filen før scriptet
stopper. Hvis man ikke gør det vil scriptet ikke kunne kører igen før
'noget andet' har fjernet filen.

//Makholm

Morten Guldager (14-05-2007)
Kommentar
Fra : Morten Guldager


Dato : 14-05-07 11:56

2007-05-14 Peter Makholm wrote
> Morten Guldager <Morten.Guldager@gmail.com> writes:
>
>>> $locked = sysopen($fh,"/tmp/test.pl.lock",O_RDWR|O_CREAT|O_EXCL);
>>> exit 2 unless $locked;
>
>> Hmm, jeg forstår vist ikke helt hvad du mener her.
>>
>> Begge eksempler slipper da låsen hvis processen dør.
>
> Flaget O_CREAT|O_EXCL betyder at sysopen skal lave filen hvis den ikke
> findes og fejle hvis filen allerede findes. Det vil sige at 'låsen'
> alene består i selve eksistensen af filen /tmp/test.pl.lock.
>
> Det vil sige at man eksplicit skal huske at slette filen før scriptet
> stopper. Hvis man ikke gør det vil scriptet ikke kunne kører igen før
> 'noget andet' har fjernet filen.

Ah ja, det er da også rigtigt.



/Morten

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste