I'm assuming (!) that this is because it's opening file handles to things that aren't actually there, hence this is my area of attack. Here's a full copy of the code..
# Main loop: # package PerlSvc; # these variables cannot be 'my' $Name = 'Filepoll'; $DisplayName = 'File Poll Service'; sub Startup { # Read in inifile values ::GetConfig(); # Get list of servers for this DSM @allservers = ::GetServerList(); # remove excluded servers for $item (@::ExcludeList){ chomp $item; $seen{$item} = 1; } for $server (@allservers){ if (!$seen{$server}){ push (@servers, $server); } } $total = scalar(@servers); $serverstring = join (",",@servers); ::Log("FilePoll service started checking $total servers: $serverst +ring ignoring: $::Exclude"); # Set all stored status's to a 1 (O.K) %status = %pingstatus = (); for $server (@servers) { chomp $server; $status{$server} = 1; $pingstatus{$server} = 1; } my $ticker=0; my $now; ($::Delay lt 0) and ($::Delay = 120); while(ContinueRun()) { $now = time (); if ($now > $ticker) { $ticker=$now + $::Delay; # Find todays and yesterdays date, for file management $today = ::Datestr(time); $tooold = time - (24*60*60); $thisminute = time - 60; $yesterday = ::Datestr($tooold); ($todaysdate, undef) = split (" ",$today); ($yesterdaysdate, undef) = split (" ",$yesterday); # Main loop for $servername (@servers){ last if (!(ContinueRun())); chomp $servername; $oldfile[0] = "\\\\$servername\\$::PollDir\\$yesterday +sdate.filepoll"; $currentfile = "\\\\$servername\\$::PollDir\\$todaysda +te.filepoll"; if (::PingCheck($servername) == -1){ if ($pingstatus{$servername} eq 0){ ::Error ("$servername - FilePoll: Failed to wr +ite to file system on $servername, server not responding to a ping"); next; } $pingstatus{$servername} = 0; next; } else { $pingstatus{$servername} = 1; } # If a file exists from yesterday, delete it AND all * +.filepoll files created more than 24 hours ago if (-e $oldfile[0]){ unlink @oldfile; # Check for any other filepoll files @allfilepolls = <//$servername/$::PollDir/*.filepo +ll>; @delete = (); for (@allfilepolls){ $mtime = (stat("$_"))[10]; if ($mtime < $tooold){ push @delete, "$_"; } } unlink @delete if (@delete); } # Write to todays file if (open (FILEPOLL,">>$currentfile")){ print FILEPOLL "$today\n"; close (FILEPOLL); } # Check file modification time $changetime = (stat("$currentfile"))[9]; if ($changetime < $thisminute){ # File hasn't been updated in the last minute $status{$servername} = 0; } else { $status{$servername} = 1; } if ($status{$servername} eq 0){ ::Error ("$servername - FilePoll: Failed to write +to file system ($currentfile) on $servername, please check"); } } } open (LOG,">$::logfile"); print LOG "Poller Status\n"; for (keys %status){ print LOG "$_\t$status{$_}\n"; } print LOG "\nPing Status\n"; for (keys %status){ print LOG "$_\t$pingstatus{$_}\n"; } close (LOG); sleep (4); } } sub Install { # add your additional install messages or functions here } sub Remove { # add your additional remove messages or functions here } sub Help { # add your additional help messages or functions here } ############################################################## package main; ############################################################## # any additional support code can go here # module references use Config::Inifiles; use Win32::TieRegistry ( Delimiter=>"/", ArrayValues=>1 ); use Win32::EventLog; use Win32::ODBC; # Constant definitions $ImagePath = $Registry->{"LMachine/SYSTEM/CurrentControlSet/Services/$ +PerlSvc::Name//ImagePath"}; $INIFILE = $logfile = $ImagePath->[0]; $INIFILE =~ s/[^\\:]+$/filepoll.ini/; $logfile =~ s/[^\\:]+$/filepoll.log/; sub GetConfig () { my $cfg = Config::IniFiles->new (-file => "$INIFILE",-default=>"De +fault"); if (defined ($cfg)) { # load configuration variables. $Delay=$cfg->val("Common","PollFileDelay"); $PollDir = $cfg->val("Common","PollDir"); $ServerClasses = $cfg->val("Common","ServerClasses"); $Exclude = $cfg->val("Common","Exclude"); @ExcludeList = split(/^/,$Exclude); } else { ::Log ("Failed to open $INIFILE."); } return; } sub Datestr(){ # Generate a date string my $time = $_[0]; my ($sec,$min,$hour,$mday,$mon,$year,undef,undef,undef) = localtim +e($time); $year += 1900; $mon += 1; $datestr = sprintf ("%2d%s%02d%s%04d%s%2d%s%02d%s%02d",$mday,"-",$ +mon,"-",$year," ",$hour,":",$min,":",$sec); return ($datestr); } sub PingCheck () { my $ipaddress = $_[0]; my $results = `ping $ipaddress -n 1`; return (-1) if ($? != 0); return (-1) if ($results =~ /Request timed out/); return (-1) if ($results =~ /Destination host unreachable/); return (0); } sub Error { my $message = $_[0]; `cawto LLH0001ELS $message`; } sub Log { my $message = $_[0]; my $EventLog; my %event=( 'EventID',100, 'EventType',EVENTLOG_INFORMATION_TYPE, 'Category',NULL, 'Strings',$message, ); $EventLog = new Win32::EventLog( 'FilePoller' ) || die $!; $EventLog->Report(\%event) || die $!; } sub GetServerList { my @array = (); my @results = `wvgethosts -o hosts -c $ServerClasses`; for (@results){ push (@array, $1) if (/\s+(\w\w\w\d\d\d\d\w\w\w)\s+\//); } @array = sort {$a cmp $b} @array; return (@array); }
In reply to Re: Re: file poll script
by northen.soul
in thread file poll script
by northen.soul
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |