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;
