Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
#!/usr/bin/env perl
#     R. Mankel, DESY Hamburg     16-Jul-2007
#     A. Parenti, DESY Hamburg    16-Apr-2008
#     $Revision: 1.3 $
#     $Date: 2009/01/07 18:26:00 $
#
#  Kill all jobs being processed by ZARAH,
#  i.e. those pending, running or suspended.
#
#  This is useful in case an error has been detected.
#  The killed jobs go to FAIL status.
#  They can be rescheduled with mps_retry.pl once the
#  problem has been fixed.
#  
#
#  Usage:
#      mps_kill.pl
#

BEGIN {
use File::Basename;
unshift(@INC, dirname($0)."/mpslib");
}
use Mpslib;

@MODSTATES = ();
@MODJOBS = ();
$killAll = 0;
$killMerge = 0;

# parse the arguments
while (@ARGV) {
  $arg = shift(@ARGV);
  if ($arg =~ /\A-/) {  # check for option 
    if ($arg =~ "h") {
      $helpwanted = 1;
    }
    elsif ($arg =~ "a") {
      $killAll = 1;
    }
    elsif ($arg =~ "m") {
      $killMerge = 1;
    }
    $optionstring = "$optionstring$arg";
  }
  else {                # parameters not related to options
    $i = $i + 1;
    if (($arg =~ m/\d+/) eq 1) {
      print "Parameter $arg interpreted as job number\n";
      push @MODJOBS,$arg;
    }
    elsif (($arg =~ m/[A-Z]+/) eq 1) {
      print "Parameter $arg interpreted as job state\n";
      push @MODSTATES,$arg;
    }
    else {
      print "Parameter $arg not recognized\n";
    }
  }
}



read_db();

if ($killAll == 1) {
  # loop over pending, running or suspended jobs
  for ($i=0; $i<@JOBID; ++$i) {
    if (@JOBSTATUS[$i] =~ /PEND/
	or @JOBSTATUS[$i] =~ /RUN/
	or @JOBSTATUS[$i] =~ /SUSP/) {
      system "bkill @JOBID[$i]";
      print "bkill @JOBID[$i]\n";
      my $disabled = "";
      $disabled = "DISABLED" if( $JOBSTATUS[$i] =~ /DISABLED/gi);
      @JOBSTATUS[$i] = $disabled."FAIL";
      @JOBHOST[$i] = "user kill";
    }
  }
}
else {
  # only kill certain job numbers or states
  for ($i=0; $i<@JOBID; ++$i) {
    if (@JOBSTATUS[$i] =~ /PEND/
	or @JOBSTATUS[$i] =~ /RUN/
	or @JOBSTATUS[$i] =~ /SUSP/) {
      my $disabled = "";
      $disabled = "DISABLED" if( $JOBSTATUS[$i] =~ /DISABLED/gi);
      $JOBSTATUS[$i] =~ s/DISABLED//gi;
      $stateText = "^@JOBSTATUS[$i]\$";
      $theNum = $i + 1;
      $jobText = "^$theNum\$";
      if ( ( (grep /$stateText/,@MODSTATES) > 0) || (grep /$jobText/,@MODJOBS) > 0) {
	print "bkill @JOBID[$i]\n";
	system "bkill @JOBID[$i]";
	@JOBSTATUS[$i] = $disabled."FAIL";
	@JOBHOST[$i] = "user kill";
      }
    }
  }
}
if ($killMerge eq 1) {
    $i = @JOBID - 1;
	if (@JOBSTATUS[$i] eq "PEND"
	    or @JOBSTATUS[$i] eq "RUN"
	    or @JOBSTATUS[$i] eq "SUSP") {
	    $stateText = "^@JOBSTATUS[$i]\$";
	    $theNum = $i + 1;
	    $jobText = "^$theNum\$";
	    if ( ( (grep /$stateText/,@MODSTATES) > 0) || (grep /$jobText/,@MODJOBS) > 0) {

		print "bkill @JOBID[$i]\n";
		system "bkill @JOBID[$i]";
		@JOBSTATUS[$i] = "FAIL";
		@JOBHOST[$i] = "user kill";
	    }
	}
}
write_db();