So far I've adapted this but I can't seem to get it to
work while strict or warnings are in place. I get undeclared varible on GetObjectList, can someone help with this a little further?
thanks!
#!/usr/bin/perl
use Win32::PerfLib;
use Win32;
use Cwd;
my $node = Win32::NodeName();
($server) = @ARGV;
Win32::PerfLib::GetCounterNames($server, \%counter);
%r_counter = map { $counter{$_} => $_ } keys %counter;
$process_obj = $r_counter{Process};
$process_id = $r_counter{'ID Process'};
#$processor_time = $r_counter{'% Processor Time'};
$process_obj = 230;
$process_id = 784;
$processor_time = 6;
#$elapsed = 684;
$memory = 180;
$page_faults = 28;
$virtual_memory = 186;
$priority = 682;
$threads = 680;
$perflib = new Win32::PerfLib($server);
$proc_ref0 = {};
$proc_ref1 = {};
$perflib->GetObjectList($process_obj, $proc_ref0);
sleep 5;
$perflib->GetObjectList($process_obj, $proc_ref1);
$perflib->Close();
$instance_ref0 = $proc_ref0->{Objects}->{$process_obj}->{Instances};
$instance_ref1 = $proc_ref1->{Objects}->{$process_obj}->{Instances};
foreach $p (keys %{$instance_ref0})
{
$counter_ref0 = $instance_ref0->{$p}->{Counters};
$counter_ref1 = $instance_ref1->{$p}->{Counters};
foreach $i (keys %{$counter_ref0})
{
# next if $instance_ref0->{$p}->{Name} eq "_Total";
if($counter_ref0->{$i}->{CounterNameTitleIndex} == $process_id
+)
{
$process{$counter_ref0->{$i}->{Counter}} =
$instance_ref0->{$p}->{Name};
$id{$counter_ref0->{$i}->{Counter}} = $p;
}
elsif($counter_ref0->{$i}->{CounterNameTitleIndex} == $process
+or_time)
{
$Numerator0 = $counter_ref0->{$i}->{Counter};
$Denominator0 = $proc_ref0->{PerfTime100nSec};
$Numerator1 = $counter_ref1->{$i}->{Counter};
$Denominator1 = $proc_ref1->{PerfTime100nSec};
$proc_time{$p} = ($Numerator1 - $Numerator0) /
($Denominator1 - $Denominator0 ) * 100;
$cputime{$p} = int($counter_ref1->{$i}->{Counter} / 100000
+00);
}
elsif($counter_ref0->{$i}->{CounterNameTitleIndex} == $memory)
{
$memory{$p} = int($counter_ref0->{$i}->{Counter} / 1024);
}
elsif($counter_ref0->{$i}->{CounterNameTitleIndex} == $page_fa
+ults)
{
$page_faults{$p} = $counter_ref1->{$i}->{Counter};
}
elsif($counter_ref0->{$i}->{CounterNameTitleIndex} == $virtual
+_memory)
{
$virtual_memory{$p} = int($counter_ref0->{$i}->{Counter} /
+ 1024);
}
elsif($counter_ref0->{$i}->{CounterNameTitleIndex} == $priorit
+y)
{
$priority{$p} = $counter_ref0->{$i}->{Counter};
}
elsif($counter_ref0->{$i}->{CounterNameTitleIndex} == $threads
+)
{
$threads{$p} = $counter_ref0->{$i}->{Counter};
}
}
}
#print " PID Process CPU CPU-Time Memory PF Virt
+.Mem Priority Thr\n";
# 0 Idle 93.73 20:51:40 16 K 1 0 K Un
+known 1
my $dump = "proctime.txt";
open(OUTPUT,">$dump") or die "592.pl can't open $dump for writing:
+$!";
# print OUTPUT "$node\n";
foreach $p (sort { $a <=> $b } keys %process)
{
$id = $id{$p};
$seconds = $cputime{$id};
$hour = int($seconds / 3600);
$seconds -= $hour * 3600;
$minute = int($seconds / 60);
$seconds -= $minute * 60;
next unless ( !($process{$p} =~ /idle/i) && !($process{$p} =~ /total/
+i) );
printf (OUTPUT "%3.f\n",$proc_time{$id});
}
close (OUTPUT);
#---------------------------------------------------------------------
+---------
#
# This module parses the file that now holds all of the processes runn
+ing on
# a given node.
#
#---------------------------------------------------------------------
+---------
my @now = localtime();
my $timeStamp = sprintf("%02d/%02d/%04d %02d:%02d", $now[4]+1, $now[3]
+, $now[5]+1900,$now[2],$now[1]);
my $file = $node."_proctime.txt";
my $result;
open(LOG,"$dump") || die "can't open $dump for reading: $!";
open(OUTPUT,">>$file") or die "can't open $dump for writing: $!";
while (<LOG>) {
chomp;
my @nums;
push @nums, $_;
$result += (shift @nums);
}
$result = $result/4;
my $fmt = sprintf "%.0f", $result;
print OUTPUT "$node $timeStamp $fmt\n";
close(LOG);
unlink ("$dump");
|