-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProcessMonitor.pl
96 lines (93 loc) · 3.71 KB
/
ProcessMonitor.pl
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
use strict;
use warnings;
use Win32::OLE('in');
use Win32::Process::List;
#Variables globales / constructores del sistema
my $processorCount; #Para obtener los procesadores del sistema
my $statsQuery; #Para crear las queries al sig objeto
my $objWMIService = Win32::OLE->GetObject("winmgmts://./root/cimv2") or die "WMI fallido\n"; #Se crea objeto del sistema
my $P = Win32::Process::List->new() or die "Lista fallida\n"; #Se crea una lista de procesos
my $flag = 0;
# Funcion ´rincipal para el monitoreo de procesos. Se mete en un ciclo while para que se realice más d euna vez
sub main(){
my %list = $P->GetProcesses();
foreach my $key ( keys %list )
{
my $process = substr $list{$key}, 0, -4; #print $process."\n";
#$statsQuery="select * from Win32_PerfRawData_PerfProc_Process where IDProcess=".$$; #Usando PID
$statsQuery="select * from Win32_PerfRawData_PerfProc_Process where Name='".$process."'"; #Nombres de proceso sin .exe #print $statsQuery;
ProcNums();
GetProcessInfo(10,10,$key);
print $flag;
}
#return $flag;
}
# Obtiene datos para el cálculo de datos
sub ProcNums(){
my $logicalProcs = $objWMIService->ExecQuery("select NumberOfLogicalProcessors from Win32_ComputerSystem"); #Obteneos los procesadores lógicos
foreach my $logicalProc (in $logicalProcs)
{
$processorCount = $logicalProc->{NumberOfLogicalProcessors};
}
}
# Obtiene los datos del proceso
sub GetProcessInfo(){
my $limit = shift; #Cantidad de calculos que realiza por proceso
my $tolerancia = shift; #Porcentaje de CPU que levanta alerta
my $PID = shift; #PID del proceso
my $outfile = "Proceso_".$PID.".txt";
my $processingTime=0;
my $timeStamp=0;
my $cpu=0;
my $cpumin=0;
my $ram=0;
my $rammin=0;
my $procName;
while($limit != 0)
{
#Se obtiene el volcado de l ainformación del proceso
my $procDump = $objWMIService->ExecQuery($statsQuery);
#Se obtienen los datos que nos competen del proceso
foreach my $procData( in $procDump){
$procName = $procData->{Name};
$cpumin = CPUutil($processingTime,$procData->{PercentProcessorTime},$timeStamp,$procData->{TimeStamp_Sys100NS});
$processingTime = $procData->{PercentProcessorTime};
$timeStamp = $procData->{TimeStamp_Sys100NS};
$rammin = $procData->{WorkingSetPrivate};
}
#Se guarda el valor máximo en CPU (para detectar el minero) de las rondas
if ($cpumin > $cpu){
$cpu = $cpumin;
}
#Se guarda el valor máximo en RAM (para detectar el minero) de las rondas
if ($rammin > $ram){
$ram = $rammin;
}
#Se pasa a la sig ronda
$limit -= 1;
}
# Se revisa si ha superado la tolerancia establecida
if ($cpu > $tolerancia){
$flag = 1;
$ram = $ram/1000000;
print "Nombre de proceso :".$procName.", PID: $PID, MaxCPU:".sprintf("%.4f",$cpu)."%, RAM:".$ram."MB \n"; #Mensaje a escribir
`..\\strings2\\x64\\Release\\strings.exe -pid $PID > $outfile` #Como puede ser una operación tardada, se hace solo con los que superar la funcionalidad
}else{
$flag = 0;
}
}
#Obtiene el dato correcto del uso de CPU
sub CPUutil(){
#Se pasan los calores de los argumentos a las variables
my $oldProcData = shift;
my $newProcData = shift;
my $oldProcTime = shift;
my $newProcTime = shift;
#Se obtiene el valor de CPU
my $procData = ($newProcData - $oldProcData);
my $procTime = ($newProcTime - $oldProcTime);
my $util=(($procData/$procTime)*100)/$processorCount;
return $util;
}
#Corre la función del monitoreo
main();