use strict; my @list; my %jobs; # start of main: open( DRAC, ".dractrack" ) or die "Can't open .dractrack\n"; @list = ; close DRAC; my $ndone = 0; for ( @list ) { chomp; my ($type,$primary,$rundir,$logfile,$host) = split; if ( not exists( $jobs{$rundir} )) { open( STAGE, "$rundir/jxrun.stg" ); my @stage = ; close STAGE; $jobs{$rundir}{term} = (split(/\b/, pop @stage))[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} ); } } # 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( DRAC, ">.dracnew" ) or die "Can't rewrite .dractrack\n"; for ( @list ) { my $dir = (split)[2]; print DRAC "$_\n" unless $jobs{$dir}{done}; } close DRAC and rename ".dracnew", ".dractrack"; } # end of main sub CheckStage { my ($path, $log) = @_; open( LOG, "$path/$log" ); my @lines = ; close LOG; $_ = pop @lines until ( /AT STAGE:/ ); (split)[3]; }