I receive an error while running this script.  It goes an gets a list of
IP addresses that are on the network, then collects SNMP data from them.

There are 8 modems available.

10.100.254.255
10.100.254.252
10.100.255.252
10.100.253.255
10.100.255.254
10.100.255.253
10.100.255.251
10.100.254.254
10.100.254.253

When the script is run I see this output:

#./fork-control-test.pl
10.100.254.255
10.100.254.252
10.100.255.252
10.100.253.255
10.100.255.254
10.100.255.253
10.100.255.251
10.100.254.254
10.100.254.253
0.0.0.0
#
 00:08:0E:E5:C6:AC
00:E0:6F:21:6F:34
00:E0:6F:38:54:06
Can't locate object method "writer. via package "IO::Pipe::End" at
./fork-control-test.pl line 92.
00:E0:6F:14:AD:A2
Can't locate object method "writer" via package "IO::Pipe::End" at
./fork-control-test.pl line 92.

Error Received:  Can't locate object method "writer" via package
"IO::Pipe::End" at ./fork-control-test.pl line 91, <GEN0> line 1.

Line 91 of fork-control-test is 
>  $pipe->writer;

If the child process is something simple like print $data, it works
great.  
As soon as I put something in that requires some processing,
filehandles, or network traffic, I get these errors.

Does anyone see issues?  What does the error actually mean?

-Mike



The entire script is below.


 use strict;
 use Proc::Fork;
 use IO::Pipe;
 use Net::SNMP;
 use SNMP;
 my $num_children = 4;    # How many children we'll create
 my @children;            # Store connections to them
 $SIG{CHLD} = 'IGNORE';   # Don't worry about reaping zombies
 # Spawn off some children
 for my $num (1..$num_children)
 {
     # Create a pipe for parent-child communication
     my $pipe = new IO::Pipe;
                                                                                       
                            
     # Child simply echoes data it receives, until EOF
     child
     {
         $pipe->reader;
         my $data;
         while ($data = <$pipe>)
         {
             chomp $data;
             my $com='notshown';
             my (%VALUES,@tmp,@macparts,$SESSION);
                                                                                       
                            
              $SESSION = new SNMP::Session( DestHost       => $data,
                                            Community      => $com,
                                            Version        => 2,
                                            Timeout        => 1000000,
                                            Retries        => 3,
                                            UseSprintValue => 1) ||
die("Can't connect to modem $data");
              $VALUES{'ip_address'} = $data;
              $VALUES{'sysDescr'}    =
$SESSION->get(".1.3.6.1.2.1.1.1.0");
              if(!$VALUES{'sysDescr'}) { return; }
              exit -11 if (! $VALUES{'sysDescr'});
              $VALUES{'mac_address'} =
$SESSION->get(".1.3.6.1.2.1.17.1.1.0");
              $VALUES{'level_up'}    =
$SESSION->get(".1.3.6.1.2.1.10.127.1.2.2.1.3.2");
              $VALUES{'level_down'}  =
$SESSION->get(".1.3.6.1.2.1.10.127.1.1.1.1.6.3");
              $VALUES{'sn_ratio'}    =
$SESSION->get(".1.3.6.1.2.1.10.127.1.1.4.1.5.3");
              $VALUES{'sw_ver'}      =
$SESSION->get(".1.3.6.1.2.1.69.1.3.5.0");
              $VALUES{'config_file'} =
$SESSION->get(".1.3.6.1.2.1.69.1.4.5.0");
              $VALUES{'firmware_ver'} =
$SESSION->get(".1.3.6.1.2.1.69.1.3.2.0");
              $VALUES{'date'}        = `date +%Y-%m-%d\\ %H:%M:%S`;
chomp $VALUES{'date'};
             @macparts=split(/\"/, $VALUES{'mac_address'});
              $VALUES{'mac_address'} = $macparts[1];
              chomp $VALUES{'mac_address'};
              $VALUES{'mac_address'} =~ s/\ /:/g;
              $VALUES{'mac_address'} =~ s/:$//;
                                                                                       
                            
              my @cf=split(/\"/, $VALUES{'config_file'});
              chomp($cf[1]);
              $VALUES{'config_file'} = $cf[1];
                                                                                       
                            
              my @fw=split(/\"/, $VALUES{'sw_ver'});
              $VALUES{'sw_ver'} = $fw[1];
                                                                                       
                            
              if (! $VALUES{'sn_ratio'}) {
              $VALUES{'sn_ratio'} = 0;
              }
              if (! $VALUES{'firmware_ver'}) {
              $VALUES{'firmware_ver'} = 'Undefined';
              }
                                                                                       
                            
              # Sanitize some vars.
              foreach my $l ('level_up', 'level_down', 'sn_ratio') {
                if ($VALUES{$l} !~ m/^[0-9\.\-]+$/){
                  @tmp=split(/\ /, $VALUES{$l});
                  $VALUES{$l}=$tmp[1];
                }
              }
              open(MODEMDATA, ">modemdata/$VALUES{'ip_address'}.txt");
              print MODEMDATA "$VALUES{'mac_address'},";
              print STDERR $VALUES{'mac_address'};
              print MODEMDATA "$VALUES{'ip_address'},";
              print MODEMDATA "$VALUES{'level_up'},";
              print MODEMDATA "$VALUES{'level_down'},";
              print MODEMDATA "$VALUES{'sn_ratio'},";
              print MODEMDATA "$VALUES{'date'},";
              print MODEMDATA "$VALUES{'config_file'},";
              print MODEMDATA "$VALUES{'firmware_ver'},";
              print MODEMDATA "$VALUES{'sysDescr'},";
              print MODEMDATA "$VALUES{'sw_ver'}\n";
              close(MODEMDATA);
         }
         exit;
     };
                                                                                       
                            
     # Parent here
   $pipe->writer;
     push @children, $pipe;
 }
                                                                                       
                            
  my($res_ip,@cmip,$key,%res_ip,$ip,%VALUES,@tmp,@macparts,$SESSION);   
my $oid_ip=".1.3.6.1.2.1.10.127.1.3.3.1.3";
  my ($session,$error_line) = Net::SNMP->session(
                                -hostname => '192.168.200.1',
                                -version => 2,
                                -community => 'notshown'
                                );
  if (!defined($res_ip=$session->get_table($oid_ip))) {
                printf(" %s\n", $session->error);
                $error_line=$session->error;
                $session->close;
                next;
        }
  my $ipc=0;
  foreach $key (sort keys %$res_ip) {
        $cmip[$ipc]=$$res_ip{$key};
        $ipc++;
  }
  $cmtstime=time();
                                                                                       
                            
 # Send some data to the kids
                                                                                       
                            
foreach $ip (@cmip){
    print "$ip\n";
    if($ip ne '0.0.0.0'){
     # pick a child at random
     my $num = int rand $num_children;
     my $child = $children[$num];
     print $child "$ip\n";
    }
  }
exit;



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to