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