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