/ 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
Zombie-scripts
Fra : Jimmy


Dato : 22-11-03 18:49

Hej

Jeg har på min frisk-installerede RH 9 nogle Perl-scripts i Cron.
De afvikles korrekt, men lukker ikke sig selv ned igen, men går i
Zombie-mode.

Det er samme scripts som jeg brugte på en RH 8, hvor der ikke var problemer.

Er der noget særligt man skal være opmærksom under programmeringen af
Perl-scripts til Cron?

Nedenfor et eksempel på et script.

Mvh
Jimmy




#!/usr/bin/perl -w
use strict;


# Check ps aux
open (PSAUX, "/bin/ps auxww |") or die "cannot open ps aux \n";

while (<PSAUX>)
{
my $line = $_;
if ($line =~ /sms_spool/)
{
exit;
}
}

close (PSAUX);


# Naar vi ikke har exit'ed ud af scriptet maa det betyde, at programmet IKKE
er startet
#
system q{/home/gsm/gsm_app/scripts/perl/sms_spool.pl &};




 
 
Lasse Hillerøe Peter~ (22-11-2003)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 22-11-03 22:16

In article <bpo7it$ijc$1@sunsite.dk>,
"Jimmy" <nyhedsgruppe2@get2net.danmark> wrote:

> Hej
>
> Jeg har på min frisk-installerede RH 9 nogle Perl-scripts i Cron.
> De afvikles korrekt, men lukker ikke sig selv ned igen, men går i
> Zombie-mode.
>
> Det er samme scripts som jeg brugte på en RH 8, hvor der ikke var problemer.
>
> Er der noget særligt man skal være opmærksom under programmeringen af
> Perl-scripts til Cron?
>
> Nedenfor et eksempel på et script.
>
> Mvh
> Jimmy
>
>
>
>
> #!/usr/bin/perl -w
> use strict;
>
>
> # Check ps aux
> open (PSAUX, "/bin/ps auxww |") or die "cannot open ps aux \n";

Du exit'er uden nødvendigvis at have læst alt det output /bin/ps har
smidt i pipen til dig. Så får /bin/ps en SIGPIPE, så vidt jeg husker.
Måske er der ændret noget i hvordan dette opfører sig mellem RH 8 og 9.

Prøv om dette hjælper:

my @psout = <PSAUX>; close PSAUX;
exit if grep /sms_spool/, psout;

> system q{/home/gsm/gsm_app/scripts/perl/sms_spool.pl &};
>

Da proces-navnet kan ændres af programmet, og da du principielt *kunne*
risikere at der kørte en proces "vi sms_spool.pl", er metoden ikke 100%
sikker. Hvis sms_spool.pl i stedet smækkede sin proces-id $$ i en fil
med et kendt navn, kunne du greppe på indholdet af denne fil i @psout,
som så passende kunne være reduceret med en map{(split/ +/)[1].

Endelig kunne checket også indbygges i selve sms_spool.pl.

-Lasse

[1] Nej. dette er ikke en fodnote men et array-index. I øvrigt antager
dette index, at PID er det andet element i ps aux outputlinien. Det
gælder NetBSD, og formentlig også Linux.

Jimmy (22-11-2003)
Kommentar
Fra : Jimmy


Dato : 22-11-03 23:46


"Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> wrote in message
news:lhp+news-F8047E.22161122112003@news.tele.dk...
> In article <bpo7it$ijc$1@sunsite.dk>,
> "Jimmy" <nyhedsgruppe2@get2net.danmark> wrote:
>

> > # Check ps aux
> > open (PSAUX, "/bin/ps auxww |") or die "cannot open ps aux \n";
>
> Du exit'er uden nødvendigvis at have læst alt det output /bin/ps har
> smidt i pipen til dig. Så får /bin/ps en SIGPIPE, så vidt jeg husker.
> Måske er der ændret noget i hvordan dette opfører sig mellem RH 8 og 9.


Ah ja - Kan godt se det er ufornuftigt.


> Prøv om dette hjælper:
>
> my @psout = <PSAUX>; close PSAUX;
> exit if grep /sms_spool/, psout;

Det vil jeg bestemt tro det gør.
Der skal et par rettelser til, og jeg har derfor ændret psout til ps_out for
at undgå fejlen "may clash with future reserved word".

Nu får jeg så:

Bareword "ps_out" not allowed while "strict subs" in use at
sms_cron_spool_starter.pl line 13.

Hvordan grepper man i et array, når den ikke er så frisk på ovenstående?


> Da proces-navnet kan ændres af programmet, og da du principielt *kunne*
> risikere at der kørte en proces "vi sms_spool.pl", er metoden ikke 100%
> sikker.

Nej, jeg har tænkt det samme. Mine meget begrænsede evner udi Perl fik mig
til at acceptere problemet.

> Hvis sms_spool.pl i stedet smækkede sin proces-id $$ i en fil
> med et kendt navn, kunne du greppe på indholdet af denne fil i @psout,

Ja - Det lyder som en plan.
Må lige søge på Google efter det og så lave det hele i programmet, så jeg
ikke skal have en wrapper til at starte det.

Tak for hjælpen,
Jimmy



Lasse Hillerøe Peter~ (23-11-2003)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 23-11-03 14:47

In article <bpoovb$7mc$1@sunsite.dk>,
"Jimmy" <nyhedsgruppe2@get2net.danmark> wrote:

> Ah ja - Kan godt se det er ufornuftigt.
>
>
> > Prøv om dette hjælper:
> >
> > my @psout = <PSAUX>; close PSAUX;
> > exit if grep /sms_spool/, psout;

> Hvordan grepper man i et array, når den ikke er så frisk på ovenstående?

Der skulle selvfølgelig stå

exit if grep /sms_spool/, @psout;
^

Jeg havde ellers kopieret det over i en shell og testet det, men glemte
så naturligvis at rette det i den tekst jeg postede.

-Lasse

Morten Guldager (23-11-2003)
Kommentar
Fra : Morten Guldager


Dato : 23-11-03 09:48

Sat, 22 Nov 2003 at 17:49 GMT Jimmy wrote
>
> Jeg har på min frisk-installerede RH 9 nogle Perl-scripts i Cron.
> De afvikles korrekt, men lukker ikke sig selv ned igen, men går i
> Zombie-mode.

Hæ, zombies er svære at forstå. Egentlig ikke et særligt perl-problem.

> Er der noget særligt man skal være opmærksom under programmeringen af
> Perl-scripts til Cron?

Nix. Ikke mere særligt end almindelig perlprogrammering på et unix
ligende system.

> #!/usr/bin/perl -w
> use strict;
>
>
> # Check ps aux
> open (PSAUX, "/bin/ps auxww |") or die "cannot open ps aux \n";
>
> while (<PSAUX>)
> {
> my $line = $_;
> if ($line =~ /sms_spool/)
> {
> exit;
> }
> }
>
> close (PSAUX);
>
>
> # Naar vi ikke har exit'ed ud af scriptet maa det betyde, at programmet IKKE
> er startet
> #
> system q{/home/gsm/gsm_app/scripts/perl/sms_spool.pl &};

Mit øje falder straks på den sidste linje. Jeg plejer at undgå brug af
"system" så meget som praktisk muligt. I til tilfælde ville jeg nok skrive
noget i stil med det her: (som jeg ikke lige har testet, for min rh73
gidder heller ikke lave zombies...)

unless (fork())
{
exec '/home/gsm/gsm_app/scripts/perl/sms_spool.pl';
}

Jeg antager forøvrigt at det er når din kode ikke rammer din exit at du har
problemet?



/Morten

Jimmy (23-11-2003)
Kommentar
Fra : Jimmy


Dato : 23-11-03 11:30


"Morten Guldager" <spamtrap@mogul.dk> wrote in message
news:slrnbs0t2g.hos.spamtrap@linuxine.mogul.dk...
> Sat, 22 Nov 2003 at 17:49 GMT Jimmy wrote

> > # Naar vi ikke har exit'ed ud af scriptet maa det betyde, at programmet
IKKE
> > er startet
> > #
> > system q{/home/gsm/gsm_app/scripts/perl/sms_spool.pl &};
>
> Mit øje falder straks på den sidste linje. Jeg plejer at undgå brug af
> "system" så meget som praktisk muligt. I til tilfælde ville jeg nok skrive
> noget i stil med det her: (som jeg ikke lige har testet, for min rh73
> gidder heller ikke lave zombies...)
>
> unless (fork())
> {
> exec '/home/gsm/gsm_app/scripts/perl/sms_spool.pl';
> }

Er ændret nu. Takker.


> Jeg antager forøvrigt at det er når din kode ikke rammer din exit at du
har
> problemet?

Næ - Faktisk tværtimod - Den laver en zombie når den åbner scriptet. Se
nedenstående:


root 24636 0.0 0.0 0 0 ? Z 11:09 0:00 [perl
<defunct>]
root 24643 0.0 1.0 10096 4004 ? S 11:09 0:00 /usr/bin/php
/root/scripts/php/netcheck.php



Ovenstående er fra et lignende script, som blot checker om jeg er på nettet.


Jeg sidder og søger efter fejlen i nedenstående kode, som jeg fik af Lasse:

-----
my @ps_out = <PSAUX>; close PSAUX;
exit if grep /netcheck.php/, ps_out;



Bareword "ps_out" not allowed while "strict subs" in use at
cron_netcheck_starter.pl line 25.
-----

Jeg formoder Lasses script hiver hele ps aux ind i et array og man så
grepper i det, men jeg har ikke fanget måden at angive variablen med ps aux
i.

Mvh
Jimmy






Lasse Hillerøe Peter~ (23-11-2003)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 23-11-03 15:05

In article <bpq26q$l4u$1@sunsite.dk>,
"Jimmy" <nyhedsgruppe2@get2net.danmark> wrote:

> "Morten Guldager" <spamtrap@mogul.dk> wrote in message
> news:slrnbs0t2g.hos.spamtrap@linuxine.mogul.dk...
> > Sat, 22 Nov 2003 at 17:49 GMT Jimmy wrote
>
> > > # Naar vi ikke har exit'ed ud af scriptet maa det betyde, at programmet
> IKKE
> > > er startet
> > > #
> > > system q{/home/gsm/gsm_app/scripts/perl/sms_spool.pl &};
> >
> > Mit øje falder straks på den sidste linje. Jeg plejer at undgå brug af
> > "system" så meget som praktisk muligt. I til tilfælde ville jeg nok skrive
> > noget i stil med det her: (som jeg ikke lige har testet, for min rh73
> > gidder heller ikke lave zombies...)
> >
> > unless (fork())
> > {
> > exec '/home/gsm/gsm_app/scripts/perl/sms_spool.pl';
> > }
>
> Er ændret nu. Takker.
>
>
> > Jeg antager forøvrigt at det er når din kode ikke rammer din exit at du
> har
> > problemet?
>
> Næ - Faktisk tværtimod - Den laver en zombie når den åbner scriptet. Se
> nedenstående:
>
>
> root 24636 0.0 0.0 0 0 ? Z 11:09 0:00 [perl
> <defunct>]
> root 24643 0.0 1.0 10096 4004 ? S 11:09 0:00 /usr/bin/php
> /root/scripts/php/netcheck.php

Mortens løsning har nok allerede løst dit problem. Men hvis du bare
exitter implicit efter exec (eller system) kan du undvære unless(fork()).

Og problemet har ikke som jeg troede noget med pipen at gøre, men er
fordi du bruger system, som - som Morten jo siger - udfører en implicit
fork, dvs dit script er parent process for den shell der bliver startet
for at køre hvad der svarer til sh -c '.../sms_spool.pl &' på en
shell-kommandolinie.

-Lasse

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

Månedens bedste
Årets bedste
Sidste års bedste