Avatar billede Swift Praktikant
29. marts 2003 - 22:22 Der er 5 kommentarer og
1 løsning

fork i forbindelse med while.....HJÆLP!!

Jeg har lavet et lille Perl modul der ud fra en liste af targest - starter et antal forks op - som hver især prøver at oprette forbindelse til et target.

Hele perl modulet bliver brugt fra et andet perl script der kalder modulet - venter 60 sekunder - kalder modulet....o.s.v.

På den måde har jeg lavet en "ServerAlive" scannings funktion.....hvis skidtet blot virkede.

Problemet er at 1. gennemkørsel af programmet går godt.
Men når hovetmodulet er færdig med at vente de 60 sekunder og starter undermodulet igen, så når der kun at blive oprettet 2 eller måske 3 forks. Af og til når alle forks at blive oprettet - men så lukker programmet BRUTALT ned - uden fejlkoder eller noget.

ER DER NOGLE DER HAR EN IDE eller LØSNING??

------KODE HERUNDER-------
# Package name
package Modules::AliveRobot;

# Uses
use strict;
use IO::Socket;
use RRDs;

# Turning on screen autoflush
$| = 1;

sub wait
{
    #wait needed to keep <defunct> pids from building up
    wait;
}

$SIG{CHLD} = \&Wait;


#-------------------------------------------------------------------------------
sub new
{
    my $self = {};
    $self->{RRDPATH} = "D:\\RRDFiles\\";
    $self->{RRDPREFIX} = "AliveRobot_";
    bless($self);
    return $self;
}


#-------------------------------------------------------------------------------
sub run
{
    my $self = shift;
    my @target;
    my @targetPort;
    my @targetDescription;
    my $targetIndex = 0;
    my $alive;
   
    $target[$targetIndex++] = "server1";
    $target[$targetIndex++] = "server1";
    $target[$targetIndex++] = "server1";
    $target[$targetIndex++] = "server2";

    $targetIndex = 0;
   
    $targetPort[$targetIndex++] = "80";
    $targetPort[$targetIndex++] = "23";
    $targetPort[$targetIndex++] = "110";
    $targetPort[$targetIndex++] = "80";

    $targetIndex = 0;
   
    $targetDescription[$targetIndex++] = "Server1_HTTP";
    $targetDescription[$targetIndex++] = "Server1_TELNET";
    $targetDescription[$targetIndex++] = "Server1_POP3";
    $targetDescription[$targetIndex++] = "Server2_HTTP";
    $targetIndex = 0;
   
    print "Starter AliveRobot...\n";

    while( defined ( my $t_ip = $target[$targetIndex] ) && defined ( my $t_port = $targetPort[$targetIndex] ) && defined ( my $t_desc = $targetDescription[$targetIndex++] ) )
    {
        next if my $pid = fork;
        die "fork - $!\n" unless defined $pid;
        $alive = $self->testAlive( $target[$targetIndex-1], $targetPort[$targetIndex-1] );
        $self->updateRRD( $targetDescription[$targetIndex-1], $alive );
        exit( fork );
    }

    continue
    {
        kill CHLD => -$$;
    }
}




#-------------------------------------------------------------------------------
sub updateRRD
{
    my $self = shift;
    my $rrdfile = $self->{RRDPATH}.$self->{RRDPREFIX}."_".$_[0].".rrd";
    my $rrdanswer;
    my $rrdData;

    print "Opdaterer ".$self->{RRDPREFIX}."_".$_[0].".rrd...";

    # Resten er sparet væk...
}


#-------------------------------------------------------------------------------
sub testAlive()
{
    my $self = shift;
    my $target;
    my $port;
    my $returnValue = 0;
   
    if( defined $_[0] && defined $_[1] )
    {
        my $target = $_[0];
        my $port = $_[1];
        my $connection;
       
        my $connection = IO::Socket::INET->new(
                Proto    => "tcp",
                PeerAddr => $target,
                PeerPort => $port
                );
       
        unless( $connection )
        {
            $returnValue = 0;
        }
        else
        {
            close $connection;
            $returnValue = 1;
        }
    }
    return $returnValue;
}


# So the require or use succeeds
1;
Avatar billede sbm Nybegynder
02. april 2003 - 11:53 #1
1) Bør du ikke lave en wait() så dine processer ikke risikerer at hænge?
2) Hvis dine forespørgsler sagtens kan afvikles indenfor de 60 sekunder, hvorfor sparer du dig så ikke den ekstra kompleksitet, og udfører dine forespørgsler sekventielt?
3) Har du overvejet at lægge jobbet i CRONTAB istedet for at kalde den med et interval fra et andet program?
Avatar billede Swift Praktikant
02. april 2003 - 17:04 #2
1. Jeg har prøvet alt muligt for at få skidtet til IKKE at crashe ved 2. gennemkørsel... også wait()

2. Lige nu er der 4 targets - gange 20 sekunder = 80 sekunder. Og jeg har jo kun 1 minut...  Og hvad hvis der er 10 targets...?

3. Jeg kører ikke UNIX men Windows....

Men har du ellers nogle gode ideer ?
Avatar billede sbm Nybegynder
02. april 2003 - 17:19 #3
Hvad sker der hvis du venter 5 min inden du starter anden gang...?
Avatar billede Swift Praktikant
03. april 2003 - 09:01 #4
Det ved jeg ikke - men jeg jeg ved at alle processerne bliver færdiggjort - da jeg har haft en PRINT lige før exit( fork );
Avatar billede sbm Nybegynder
03. april 2003 - 13:28 #5
Så er jeg umiddelbart løbet tør for gode idéer. :-(
Avatar billede Swift Praktikant
13. november 2005 - 22:26 #6
Lukker spørgsmålet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester