#  $Header: topProcs.pl 30-jan-2004.10:32:51 skumar Exp $
# 
# Copyright (c) 2001, 2004, Oracle Corporation.  All rights reserved.  
#
#    NAME
#      topProcs.pl - <one-line expansion of the name>
#
#    DESCRIPTION
#      This script lists up to 20 processes including: 
#      -  the top 10 processes that consume the most CPU time in %
#      -  the top 10 processes that has the most execution time
#  
#    MODIFIED  (MM/DD/YY)
#       skumar   01/30/04 - sort by pcpu and then by time 
#       skumar   01/19/04 - fix vsz values 
#       skumar   12/23/03 - AIX version 

use English;
use hostGenFunctions;

# Format: days-hours:mins:seconds.partial_seconds
sub convertTimeToSecs
{
  my $time = shift(@_);
  my $secs = 0;
  my @t_array = split(":", $time);
  my $d = 0;
  my $h = 0;
  my $m = 0;
  my $s = 0;
  my $ps = 0;

  if (@t_array == 3)
  {
    ($h, $m, $s) = @t_array;
    if ($h =~ /-/) # number of days
    {
      ($d, $h) = split('-', $h);
      $secs = $d*24*3600;
    }
    $secs += ($h*3600);
  }
  else
  {
    ($m, $s) = @t_array;
    if ($s =~ /\./) # partial seconds
    {
      ($s, $ps) = split('\.', $s);
      $secs = $ps;
    }
  }
  $secs += ($m*60) + $s;
  return $secs;
}

my @processList = ();
my %topPcpuS = ();
my $count = 0;
my $process = '';
my %pidS = ();
my %pcpuS = ();
my %timeS = ();
my $sorted_item = '';
my %uidS = ();
my %uidP = ();
my $uid = '';
my @fields = ();
my %SZ = ();

$ENV{PATH} = "/usr/bin:/usr/sbin:/bin:/usr/local/bin";
@processList =
  `ps glww` or die "Failed to run ps\n";

# skip the header
shift @processList;

foreach $process (@processList)
{
  if ($process ne '' && $process !~ /<idle>/ && $process !~ /ps glww/)
  {
    chomp($process);
    @fields = split (" ", $process, 15);
    $uidP{$fields[3]} = $fields[2];
    $uidS{$fields[2]} = '';
    $SZ{$fields[3]} = $fields[9];
  }
}

@processList2 =
  `ps gvww` or die "Failed to run ps\n";

shift @processList;

foreach $process (@processList2)
{
  chomp($process);

  # skip ps process and perl process
  if ($process ne '' && $process !~ /<idle>/ && $process !~ /ps gvww/)
  {
    ($pid, $tty, $stat, $time, $pgin, $size, $res, $lim, $tsiz, $trs, $pcpu, $pmem, $comm) = split (" ", $process, 13);

    next if $pid == $$ || $pid == 0; # skip current perl process.

    # put value in array pidS
    $pidS{$pid}=$process;

    $pcpuS{$pid} = $pcpu;
  }
}

foreach $sorted_item (reverse sort {$pcpuS{$a} <=> $pcpuS{$b}} keys %pcpuS)
{
  ($pid, $tty, $stat, $time, $pgin, $size, $res, $lim, $tsiz, $trs, $pcpu, $pmem, $comm) = split (" ", $pidS{$sorted_item}, 13);

  $timeS{$pid} = convertTimeToSecs($time);

  last if (++$count == 20);
}

sub sortfunc
{
  $pcpuS{$a} <=> $pcpuS{$b} || $timeS{$a} <=> $timeS{$b};
}

foreach $sorted_item (reverse sort sortfunc keys %timeS)
{
  push @topProcS, $pidS{$sorted_item}; 
}

foreach $uid (keys %uidS)
{
  push @uids, $uid;
}

$users = `$ENV{EMDROOT}/bin/nmupm usernames @uids`;
chomp($users);

@usernames = split(' ', $users);

foreach $uid (keys %uidS)
{
  $uidS{$uid} = shift(@usernames);
}

foreach $sorted_item (@topProcS)
{
  ($pid, $tty, $stat, $time, $pgin, $size, $res, $lim, $tsiz, $trs, $pcpu, $pmem, $comm) = split (" ", $sorted_item, 13);

  $time = convertTimeToSecs($time);
  $size += $SZ{$pid};
  print "em_result=$pmem|$pcpu|$time|$size|$res|$uidS{$uidP{$pid}}|$pid|$comm\n";
}
