Changeset 95 for trunk/oarutils


Ignore:
Timestamp:
Jan 24, 2013, 9:55:51 PM (11 years ago)
Author:
g7moreau
Message:
  • Add folder list command
  • Add state manager
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/oarutils/oar-dispatch

    r94 r95  
    1515
    1616my $task = 0;
    17 my $overload = 1.1;
     17my $overload = 1;
    1818my $file = '';
     19my $dir;
     20my $cmd;
    1921my $logtrace;
    2022my $verbose;
     
    2729   'overload=f'   => \$overload,
    2830   'file=s'       => \$file,
     31   'dir=s'        => \$dir,
     32   'cmd=s'        => \$cmd,
    2933   'logtrace=s'   => \$logtrace,
    3034   'verbose'      => \$verbose,
     
    6266# job to run
    6367my @job = ();
    64 open (JOB_LIST, '<', "$file") or die "can't open $file: $!";
    65 while (<JOB_LIST>) {
    66    chomp;
    67    next if m/^#/;
    68    push @job, $_ if m/^\s*oarsub/;
    69    }
    70 close JOB_LIST;
     68#open (JOB_LIST, '<', "$file") or die "can't open $file: $!";
     69#while (<JOB_LIST>) {
     70#   chomp;
     71#   next if m/^#/;
     72#   push @job, $_ if m/^\s*oarsub/;
     73#   }
     74#close JOB_LIST;
     75if (-e "$file") {
     76   my $job_num = 0;
     77   open(JOB_LIST, '<', "$file") or die "error: can't open job file $file: $!";
     78   while (my $job_cmd = <JOB_LIST>) {
     79      chomp $job_cmd;
     80      next if $job_cmd =~ m/^#/;
     81      next if $job_cmd =~ m/^\s*$/;
     82      # Add oarsub -S if not
     83      $job_cmd = "oarsub -S $job_cmd" if $job_cmd !~ m/^\s*oarsub/;
     84      $job_num++;
     85      my ($job_name) = $job_cmd =~ m/#.*?\bname=(\S+?)\b/i;
     86      $job_name ||= $job_num;
     87      push @job, {
     88         name   => $job_name,
     89         cmd    => "$job_cmd",
     90         num    => $job_num,
     91         };
     92      }
     93   close JOB_LIST;
     94   }
     95else {
     96   # Add oarsub -S if not
     97   $cmd = "oarsub -S $cmd" if $cmd !~ m/^\s*oarsub/;
     98   my $job_num = 0;
     99   opendir(DIR, $dir) or die "error: can't open folder $dir: $!";
     100   while (my $item = readdir(DIR)) {
     101      next if $item =~ m/^\./;
     102      next if $item =~ m/:/;
     103      next if $item =~ m/\.old$/;
     104      next if $item =~ m/\.sav$/;
     105      next if $item =~ m/\.bak$/;
     106      next if $item =~ m/\.no$/;
     107      next unless (-d "$dir/$item");
     108      $job_num++;
     109      push @job, {
     110         name   => $item,
     111         cmd    => "cd $dir/$item/; $cmd",
     112         num    => $job_num,
     113         };
     114      }
     115   closedir DIR;
     116   }
    71117
    72118my $container_id=$ENV{OAR_JOB_ID};
     
    79125   }
    80126
    81 
    82127my $finished = new Coro::Signal;
     128my $job_todo = new Coro::Semaphore 0;
     129my $job_name_maxlen;
     130for (@job) {
     131   $job_todo->up;
     132   $job_name_maxlen = length($_->{name}) if length($_->{name}) > $job_name_maxlen;
     133   }
     134
    83135my $job_active = new Coro::Semaphore 0;
    84 my $job_todo = new Coro::Semaphore 0;
    85 $job_todo->up for (@job);
    86136
    87137my %scheduled = ();
     
    115165   JOB:
    116166   for my $job (@job) {
     167      my $job_name   = $job->{name};
     168      my $job_cmd    = $job->{cmd};
     169
     170      # job has been already run ?
     171      if (exists $state{$job_name}) {
     172         if ($state{$job_name} eq 'start') {
     173            print "warning: job $job_name was not clearly finished, relaunching...\n"
     174               if $verbose;
     175            }
     176         elsif ($state{$job_name} eq 'end') {
     177            delete $state{$job_name}; # free memory
     178            $job_todo->down;
     179            print "warning: job $job_name already run\n" if $verbose;
     180            cede;
     181            next JOB;
     182            }
     183         }
     184
    117185      while ($job_active->count >= $task*$overload) {
    118186         cede;
     
    122190      last JOB if $oar_checkpoint->count() > 0;
    123191
    124       $job =~ s/^\s*oarsub//;
    125       print "oarsub $insert_oar_option $job" if $verbose;
    126       my $job_id = `oarsub $insert_oar_option $job|grep ^OAR_JOB_ID|cut -f 2 -d '='`;
     192      $job_cmd =~ s/^\b(oarsub)\b/$1 $insert_oar_option/;
     193      print "$job_cmd" if $verbose;
     194      my $job_id = `$job_cmd|grep ^OAR_JOB_ID|cut -f 2 -d '='`;
    127195      chomp $job_id;
    128196      if ($job_id > 1) {
    129          $scheduled{$job_id}++;
     197         $scheduled{$job_id} = {
     198            name         => $job_name,
     199            };
    130200         $job_active->up;
     201
     202         my $msg = sprintf "start job %${job_name_maxlen}s / %i at %s\n",
     203            $job_name, $job_id, time;
     204         $log_h->print($msg) if $logtrace;
     205         print($msg) if $verbose;
    131206         }
    132207      cede;
     
    142217            last GUARD if $is_finish =~ m/Terminated/;
    143218            }
    144          delete $scheduled{$job_id};
     219
     220         my $msg = sprintf "end   job %${job_name_maxlen}s / %i at %s\n",
     221            $scheduled{$job_id}->{name}, $job_id, time;
     222
     223            # Job non finish, just suspend if received checkpoint signal
     224            $msg =~ s/^end\s+job/suspend job/
     225               if $sig_transmit and $oar_checkpoint->count() > 0;
     226
     227            $log_h->print($msg) if $logtrace;
     228            print($msg) if $verbose;
     229
    145230         $job_active->down;
    146231         $job_todo->down;
     232         delete $scheduled{$job_id};
    147233         } $job_id;
    148234      }
Note: See TracChangeset for help on using the changeset viewer.