/ 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
Check om perl scripten kører eller ikke
Fra : Claus Jul Larsen


Dato : 28-08-02 06:55

Hej,

Er det muligt at lave en kontrolrutine, sådan at man undgår at samme
script kører flere gange.

F.eks. har jeg newsletter.pl som sender nyhedsbreve rundt og for at ikke
belaste serveren unødigt, så skal newsletter.pl kun køre en ad gangen.
Det skal være sådan, at når jeg kører newsletter.pl, så checker scripten
i starten om der i forvejen kører en newsletter.pl og hvis der findes en
i forvejen, så kører den ikke - ellers går den i gang.

Kan man det i NT-miljøet?

Claus


 
 
Lars Kim Lund (28-08-2002)
Kommentar
Fra : Lars Kim Lund


Dato : 28-08-02 08:16

Claus Jul Larsen <cjl@steria.dk> wrote:

>F.eks. har jeg newsletter.pl som sender nyhedsbreve rundt og for at ikke
>belaste serveren unødigt, så skal newsletter.pl kun køre en ad gangen.
>Det skal være sådan, at når jeg kører newsletter.pl, så checker scripten
>i starten om der i forvejen kører en newsletter.pl og hvis der findes en
>i forvejen, så kører den ikke - ellers går den i gang.
>
>Kan man det i NT-miljøet?

Det er svært at se om et specifikt script kører. Du kan checke på om
perl er i gang, men du kan have andre perl-ting kørende.

Det letteste er at lave en lock-fil med perl eller i det batch-job der
kalder perl.

Pseudo-kode:

Stop hvis lock-fil findes
Opret lock-fil
<KODE>
Slet lock-fil

--
Lars Kim Lund
http://www.net-faq.dk/

Claus Jul Larsen (28-08-2002)
Kommentar
Fra : Claus Jul Larsen


Dato : 28-08-02 13:39

Hm, det er ikke helt holdbar.

I de tilfælde af, at der sker en reboot midt i en proces, så bliver
lockfilen ikke slettet.

Det jeg er interesseret i er at perl-scripten kan se om der er en proces
som kører newsletter.pl - hvis det er tilfældet, så køres den næste
proces ikke.

Denne løsning er mere robust.

CLaus

Lars Kim Lund wrote:

> Claus Jul Larsen <cjl@steria.dk> wrote:
>
>
>>F.eks. har jeg newsletter.pl som sender nyhedsbreve rundt og for at ikke
>>belaste serveren unødigt, så skal newsletter.pl kun køre en ad gangen.
>>Det skal være sådan, at når jeg kører newsletter.pl, så checker scripten
>>i starten om der i forvejen kører en newsletter.pl og hvis der findes en
>>i forvejen, så kører den ikke - ellers går den i gang.
>>
>>Kan man det i NT-miljøet?
>>
>
> Det er svært at se om et specifikt script kører. Du kan checke på om
> perl er i gang, men du kan have andre perl-ting kørende.
>
> Det letteste er at lave en lock-fil med perl eller i det batch-job der
> kalder perl.
>
> Pseudo-kode:
>
> Stop hvis lock-fil findes
> Opret lock-fil
> <KODE>
> Slet lock-fil
>
>


Lars Balker Rasmusse~ (28-08-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 28-08-02 15:26

Claus Jul Larsen <cjl@steria.dk> writes:
> I de tilfælde af, at der sker en reboot midt i en proces, så bliver
> lockfilen ikke slettet.

Jeg ved ikke hvor godt flock er porteret til Win32, men måske det var
noget i stedet for?

> Det jeg er interesseret i er at perl-scripten kan se om der er en
> proces som kører newsletter.pl - hvis det er tilfældet, så køres den
> næste proces ikke.

Det tror jeg ikke der er nogen nem måde til - Win32-modulerne er lidt
ufærdige når man skal til at lave noget gris. Hvis du kan kan finde
en ps.exe kunne du kalde den inde fra perl.
--
Lars Balker Rasmussen                  "S.M.R.T."

Lars Kim Lund (28-08-2002)
Kommentar
Fra : Lars Kim Lund


Dato : 28-08-02 16:07

Lars Balker Rasmussen <lars@balker.org> wrote:

>> I de tilfælde af, at der sker en reboot midt i en proces, så bliver
>> lockfilen ikke slettet.
>
>Jeg ved ikke hvor godt flock er porteret til Win32, men måske det var
>noget i stedet for?

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.

>> Det jeg er interesseret i er at perl-scripten kan se om der er en
>> proces som kører newsletter.pl - hvis det er tilfældet, så køres den
>> næste proces ikke.
>
>Det tror jeg ikke der er nogen nem måde til - Win32-modulerne er lidt
>ufærdige når man skal til at lave noget gris. Hvis du kan kan finde
>en ps.exe kunne du kalde den inde fra perl.

Processer er ret anderledes på Windows. Og ting som ps er (kan) ikke
porteret. Der findes diverse tricks, men typisk vil man kun se
proces-navnet og ikke kaldet.

--
Lars Kim Lund
http://www.net-faq.dk/

Lars Balker Rasmusse~ (28-08-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 28-08-02 16:23

Lars Kim Lund <lkl@fabel.dk> writes:
> Lars Balker Rasmussen <lars@balker.org> wrote:
> >Det tror jeg ikke der er nogen nem måde til - Win32-modulerne er lidt
> >ufærdige når man skal til at lave noget gris. Hvis du kan kan finde
> >en ps.exe kunne du kalde den inde fra perl.
>
> Processer er ret anderledes på Windows. Og ting som ps er (kan) ikke
> porteret. Der findes diverse tricks, men typisk vil man kun se
> proces-navnet og ikke kaldet.

Jeg fik da hacket lidt med Win32API::ProcessStatus og Win32::Process,
hvor jeg fik en liste af PIDs som jeg kunne finde ud af om jeg havde
rettighed til at undersøge. Men derfra og til at komme med en liste
med processernes navne er der alligevel et stykke.

Som sagt er Win32-modulerne ikke specielt færdige på det punkt - det
modul der så mest lovende ud (Win32::IProc) er droppet af nettet, så
det kunne jeg slet ikke finde.
--
Lars Balker Rasmussen                  "S.M.R.T."

Lars Kim Lund (28-08-2002)
Kommentar
Fra : Lars Kim Lund


Dato : 28-08-02 16:47

Lars Balker Rasmussen <lars@balker.org> wrote:

>> Processer er ret anderledes på Windows. Og ting som ps er (kan) ikke
>> porteret. Der findes diverse tricks, men typisk vil man kun se
>> proces-navnet og ikke kaldet.
>
>Jeg fik da hacket lidt med Win32API::ProcessStatus og Win32::Process,
>hvor jeg fik en liste af PIDs som jeg kunne finde ud af om jeg havde
>rettighed til at undersøge. Men derfra og til at komme med en liste
>med processernes navne er der alligevel et stykke.
>
>Som sagt er Win32-modulerne ikke specielt færdige på det punkt - det
>modul der så mest lovende ud (Win32::IProc) er droppet af nettet, så
>det kunne jeg slet ikke finde.

Jeg vil gætte på du kan bruge wmi.pm til det. Men problemet i denne
sammenhæng er at

perl mitscript.pl

vil blive vist som en perl-proces. Det vil sige du kan se
perl-processen men ikke hvilket script.

--
Lars Kim Lund
http://www.net-faq.dk/

Claus Jul Larsen (30-08-2002)
Kommentar
Fra : Claus Jul Larsen


Dato : 30-08-02 08:20

>>Jeg ved ikke hvor godt flock er porteret til Win32, men måske det var
>>noget i stedet for?


> 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?

Claus


Lars Balker Rasmusse~ (30-08-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 30-08-02 09:03

Claus Jul Larsen <cjl@steria.dk> writes:
> Er det noget til Perl?

perldoc -f flock
--
Lars Balker Rasmussen "Special is bad."

Lars Kim Lund (30-08-2002)
Kommentar
Fra : Lars Kim Lund


Dato : 30-08-02 11:05

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/

Lars Kim Lund (30-08-2002)
Kommentar
Fra : Lars Kim Lund


Dato : 30-08-02 11:07

Lars Kim Lund <lkl@fabel.dk> wrote:

> open (FOO, ">instans.lock") or die();
> flock (FOO, 2+4) or die();
>
> print "Hello World\n";
> sleep 1000;
>
> flock (FOO, LOCK_UN);

Suk, flock (FOO, 8); hvis man ikke bruger konstanterne,

--
Lars Kim Lund
http://www.net-faq.dk/

Søg
Reklame
Statistik
Spørgsmål : 177436
Tips : 31962
Nyheder : 719565
Indlæg : 6408017
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste