use strict; my %jobs; # start of main: open( IN, ".dractrack" ) or die "Can't open .dractrack for input: $!\n"; my $ndone = 0; while( ) { chomp; my ($type,$primary,$rundir,$logfile,$host) = split; if ( not exists( $jobs{$rundir} )) { open( STAGE, "$rundir/jxrun.stg" ); my $lastrec; while( ) { $lastrec = $_; } close STAGE; $jobs{$rundir}{term} = (split(/\b/, $lastrec))[8]; } my $atstage = CheckStage( $rundir, $logfile ); if ( $atstage == $jobs{$rundir}{term} ) { print "$type job $primary on $host -- DONE"; $jobs{$rundir}{done}++; $ndone++; } else { printf("Cell: %s Verifying: %s at stage %3d of %3d -- %2.2f", $primary, $type, $atstage, $jobs{$rundir}{term}, 100 * $atstage / $jobs{$rundir}{term} ); } } close IN; # write a "current" version of ".dractrack", if necessary. # WATCH OUT! You REALLY need a semaphore or some other file # locking mechanism here (check Sean Burke's article about # semaphores in the most recent Perl Journal: # http://www.sysadminmag.com/tpj/) if ( $ndone ) { open( OUT, ">.dracnew" ) or die "Can't open .dracnew for output: $!\n"; open( IN, ".dractrack" ) or die "Can't open .dractrack for input: $!\n"; while( ) { my $dir = (split)[2]; print OUT unless $jobs{$dir}{done}; } close DRAC and rename ".dracnew", ".dractrack" or die "Cannot rename .dracnew to .dractrack: $!\n"; } # end of main sub CheckStage { my ($path, $log) = @_; open( LOG, "$path/$log" ) or die "Cannot open $path/$log for input: $!\n"; my $at_stage_rec = undef; while( ) { $at_stage_rec = $_ if /AT STAGE:/; } close LOG; $at_stage_rec ? (split / /, $at_stage_rec)[3] : undef; }