[Info-vax] audit and accounting data into tabular or cross-platform format

Hein RMS van den Heuvel heinvandenheuvel at gmail.com
Thu Aug 18 11:06:05 EDT 2011


On Aug 18, 6:05 am, IanMiller <g... at uk2.net> wrote:
> I expect Hein vdH has done this is in perl already :-)

For accounting, and batch job logs,  I have a few yes :-)
Never needed to do much with auditing.

I'll put two chunks below.

First one to scan a pre-generated listing to look for batch jobs
lasting more than 5 second, reporting by job name.

Second one executes the account command and processes the piped data,
looking for jobs using significant CPU.

Both reports  $user, $start, $finish, $elapsed, $cpu, $io in columns,
switch to CSV is trivial.

Hein


#----------------------------- ACCOUNTING_SUMMARY.PL
---------------------------
use strict;
use warnings;
use Time::Local;

my $MONTHS = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
my $ONE_DAY = 86400;


my (%jobs, $i);
$i = 0;

my  $batch = 0;
my  $batch_jobs = 0;
my  $lines = 0;
my ($date, $finish_time, $user, $elap, $cpu, $io, $job);

for (<>) {
    if (/^BATCH/) {
       $batch = 1;
       $date= $finish_time= $user= $elap= $cpu= $io= $job= "";
    }
    next unless $batch;
    chomp;
    if (/^Own.*\s(\d+:\d+:\d+).\d+/) {
       $elap = $1;
       $batch = 0 if $elap le '00:00:05';
       next;
    }
    $user = $1 if /^Username:\s+(\w+)/;
    $cpu  = $1 if /^Ter.*\s(\d+:\d+:\d+).\d+/;
    $job  = $1 if /^Job name:\s+(\w+)/;
    if (/^Acc.*ime:\s+(\d+)-(...)-(\d+)\s+(\d+):(\d+):(\d+)/) { #
Date ?
       $date = "$1-$2-$3 $4:$5";  # Re-assemble VMS Date
       $finish_time = timelocal($6,$5,$4,$1,index($MONTHS,$2)/
3,$3-1900);
    }
    if (/^Pag.*Direct IO:\s+(\d+)/){
       $io   = $1;
       $batch = 0;
       $batch_jobs++;
       if ($jobs{"$job $finish_time"}) {
         print STDERR "Dup for <$job> <$finish_time>\n";
       }
       $jobs{"$job $finish_time"} = "$date,$elap,$cpu,$io\n";
    }
# debug   last if $i++ > 2000;
}
print STDERR "Done reading, found $batch_jobs batch jobs longer than 5
second. Sorting array ", scalar %jobs, "\n";

for (sort keys %jobs) {
       print qq(Job Name,Finish Time,Elapsed,Cpu Time,Direct IO\n)
unless $lines++;
    my ($job,$time) = split;
    print $job, ',', $jobs{$_};
#    last if $i++ > 2040;
}

print STDERR "$lines printed\n";



# ---------------------------------------------  ACCOUNTING_BATCH.PL
-----------------------
use strict;
use warnings;

my $MIN_CPU = q(00:00:30);
my $MAX_CPU = q(00:20:00);

my $start_time = shift or die "need at least a start time, end  time
optional";
my $end_time   = shift;
my $command = shift  and die "Too many arguments. Forgot to quote date
+time?";
my $lines = 0;
$command = "account/full/proc=batch/type=process/since=$start_time";
$command .= "/before=$end_time" if $end_time;
my ($user, $start, $finish, $elapsed, $cpu, $job, $date, $io);
$date = '?';
for (qx($command)) {
   $user       = $1 if /^Use\S+\s+(\w+)/;
   next unless $user;
   if (/^Acc.*\s(\d+-\w+-\d+)\s+(\d\d:\d\d):\d\d\./) {
          $finish     = $2;
          if ($1 ne $date) {
             $date = $1;
             print "-- $date --   Jobs with more than $MIN_CPU cpu
time. STAR when more than $MAX_CPU\n";
             printf qq(-- %-9s %5s %5s %5s %8s %3s %1s %s\n),  qw(User
Start End Elap CPU Mio ? Job_name);
          }
   }
   $start      = $1 if /^Pro.*\s(\d\d:\d\d):\d\d\./;
   $elapsed    = $1 if /^Own.*\s(\d\d:\d\d):\d\d\./;
   $cpu        = $1 if /^Ter.*\s(\d\d:\d\d:\d\d)\./;
   next unless $cpu and $cpu ge $MIN_CPU;
   $job        = $1 if /^Job name:\s+(\S+)$/;
   if (/^Pag.*IO:\s+(\d+)/) {
      $io = $1/1000000;
      printf qq(%-12s %s %s %s %s %3d %s %s\n),
         $user, $start, $finish, $elapsed, $cpu, $io, ($cpu ge
$MAX_CPU) ? '*' : ' ', $job;
      $user = $cpu = $start =  $finish = $elapsed = $cpu = $job = '';
      $io = 0;
   }
}







More information about the Info-vax mailing list