/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Låsning af program/enhed
Fra : Jimmy


Dato : 25-11-02 13:53

Hej

Jeg har skrevet et lille Perl-program, der tilgår et GSM-modem og sender en
række SMS fra en database.

Hvis man tilgår modemet på samme tid det er ved at sende låser det.
Perl-programmet kaldes hvert minut af Cron.

Uanset at man sætter tiden op for Cron vil jeg en dag overlappe.

Hvordan løses det på Linux/RedHat 8?

1)
Jeg kan i starten af mit program kaste en linie i en DB-tabel om at jeg vil
igang.
Hvis der er en linie i forvejen er en anden instans igang og jeg dropper
det.

I slutningen af programmet fjerner jeg linien så næste kald af programmet
kan komme igang.

2)
Jeg kan låse modemet når jeg starter.
Efterfølgende programmer der kalder det vil så fejle.

Er der andre løsninger?
Hvilken ville I vælge og hvorfor?

Mvh
Jimmy



 
 
Claus Rasmussen (25-11-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 25-11-02 14:15

Jimmy wrote:

> Uanset at man sætter tiden op for Cron vil jeg en dag overlappe.
> Hvordan løses det på Linux/RedHat 8?

Standard er at lave en pid-fil i kataloget /var/run, når dit program
starter og slette den igen, når programmet slutter. Her er noget shell
kode, der gør det:

#!/bin/sh

PRG=$0
PID=/var/run/$PRG.pid

if [ -f $PID ]
then pid=$(cat $PID)
prg=$(ps -p $pid -o %c --no-headers)
if [ $? != 0 ]
then echo "PID file found but process seems to be dead" >&2
rm -f $PID
elsif [ "$prg" != $PRG ]
then echo "PID $pid running but a different process" >&2
rm -f $PID
else echo "Program already running" >&2
exit 1
fi
fi
echo $$ > $PID

# ...

rm -f $PID

MVH

-Claus


Jimmy (25-11-2002)
Kommentar
Fra : Jimmy


Dato : 25-11-02 15:01


"Claus Rasmussen" <clr@cc-consult.dk> wrote in message
news:art7lt$s01$1@sunsite.dk...
> Jimmy wrote:
>
> > Uanset at man sætter tiden op for Cron vil jeg en dag overlappe.
> > Hvordan løses det på Linux/RedHat 8?
>
> Standard er at lave en pid-fil i kataloget /var/run, når dit program
> starter og slette den igen, når programmet slutter. Her er noget shell
> kode, der gør det:

Det er da ret interessant.
Så kalder jeg koden med programmet som parameter og så starter programmet
kun. hvis dens PID ikke findes?
Er det korrekt opfattet?

Mvh
Jimmy


>
> #!/bin/sh
>
> PRG=$0
> PID=/var/run/$PRG.pid
>
> if [ -f $PID ]
> then pid=$(cat $PID)
> prg=$(ps -p $pid -o %c --no-headers)
> if [ $? != 0 ]
> then echo "PID file found but process seems to be dead"
>&2
> rm -f $PID
> elsif [ "$prg" != $PRG ]
> then echo "PID $pid running but a different process"
>&2
> rm -f $PID
> else echo "Program already running" >&2
> exit 1
> fi
> fi
> echo $$ > $PID
>
> # ...
>
> rm -f $PID
>
> MVH
>
> -Claus
>



Claus Rasmussen (25-11-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 25-11-02 15:23

Jimmy wrote:

> Så kalder jeg koden med programmet som parameter og så starter programmet
> kun. hvis dens PID ikke findes?
> Er det korrekt opfattet?

Du kalder ikke programmet med nogen parameter. $0 er navnet på
programmet i 'sh' (men ikke i perl). Men ellers er det rigtigt,
ja.

(test det dog lige først)

-Claus


Claus Rasmussen (25-11-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 25-11-02 15:25

Claus Rasmussen wrote:

> elsif

s/elsif/elif/g

-Claus


Kim Hansen (25-11-2002)
Kommentar
Fra : Kim Hansen


Dato : 25-11-02 23:42

Claus Rasmussen <clr@cc-consult.dk> writes:

> Jimmy wrote:
>
> > Så kalder jeg koden med programmet som parameter og så starter programmet
> > kun. hvis dens PID ikke findes?
> > Er det korrekt opfattet?
>
> Du kalder ikke programmet med nogen parameter. $0 er navnet på
> programmet i 'sh' (men ikke i perl). Men ellers er det rigtigt,
> ja.

Jo, det er også navnet på programmet i Perl, se perlvar(1):

$0 Contains the name of the program being executed. On some oper-
ating systems assigning to $0 modifies the argument area that
the ps program sees. This is more useful as a way of indicat-
ing the current program state than it is for hiding the program
you're running. (Mnemonic: same as sh and ksh.)

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Claus Rasmussen (26-11-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 26-11-02 11:59

Kim Hansen wrote:

> Jo, det er også navnet på programmet i Perl, se perlvar(1):

Right. Det var $ARGV[0], jeg forvekslede det med.

-Claus


Jimmy (25-11-2002)
Kommentar
Fra : Jimmy


Dato : 25-11-02 17:29


"Claus Rasmussen" <clr@cc-consult.dk> wrote in message
news:art7lt$s01$1@sunsite.dk...
> Jimmy wrote:
>
> > Uanset at man sætter tiden op for Cron vil jeg en dag overlappe.
> > Hvordan løses det på Linux/RedHat 8?
>
> Standard er at lave en pid-fil i kataloget /var/run, når dit program
> starter og slette den igen, når programmet slutter. Her er noget shell
> kode, der gør det:

Men er det ikke kun til root?
svjv kan non-root ikke afvikle programmer derfra, men der tager jeg måske
fejl?

Mvh
Jimmy



Claus Rasmussen (25-11-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 25-11-02 20:30

Jimmy wrote:

> Men er det ikke kun til root?
> svjv kan non-root ikke afvikle programmer derfra, men der tager jeg måske
> fejl?

Det er kun root, der kan skrive i de kataloger (der skal ikke udføres
programmer derfra). Men hvis programmet startes fra den globale cron
fil, kører det i forvejen som root. Og ellers kan man enten oprette
et underkatalog til /var/run, hvor den aktuelle bruger får skrivetil-
ladelse, eller man kan var lægge sin .pid fil et andet sted.

-Claus


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

Månedens bedste
Årets bedste
Sidste års bedste