#!/usr/bin/perl

use 5.038.2;
use utf8;

# (c) Jesús Lozano Mosterín, 2026

die "OS not fully reaady" unless ($^O =~ /[x|bsd]/i);

die "uptime cmd not found" unless (length (`which uptime`) > 6);

# sáb 09 may 2026 22:43:32 CEST

# use 5.043.10;    # dev version
                   # Sencillamente, llega un momento que no lo entiendo
                   # y me mareo viendo en el regex que no da error

# use utf8;       # esto se necesita para todo, incluído comentarios
                 # posible uso de crontab,
    		# pero, mejor no considerar la cpu
		# al arranque

my $DEBUG = 1;             # este debug no es debug normal, hace más cosas

my $VERSION = 0.061;

my $RNDPOOL13 = '/home/jesus/src/rand/POOL13';


# Main purpose

# Aquí trato de hacer un wrapper de 'uptime'
# que tome atividad de cpu media a los 5 minutos
# (eso lo da el comando en la cifras 1,5,15min)
# A continuación, grabo cada 5*60 minutos su
# media en fichero

# En uptime es la cifra de en medio, hay comas a barullo

# Cada vez que se arranque el fichero, se lee
# el valor anterior
# De esta manera se tiene una media móvil,
# «de amplitud variable» (o no)
# No pasa nada, porque lo que se va a tener
# es una media degradable con el tiempo,
# como las de la bolsa

# EL OBJETIVO ES CONSEGUIR AHORROS, y detectar picos
# No vas a pagar la skyline de otros, básicamente, aunque 
# esto está sujeto a intercambios de tech como siempre

my $pastcpu;
open my $fhi, '<', "/home/jesus/src/sensor/5mincpuload.log" or warn $!;
$pastcpu = <$fhi>;      # esto lee una línea
close $fhi;
chomp $pastcpu;
my $ntask = 0;

$pastcpu //= 1.00000000000;

my $meancpu = $pastcpu;
my $count = 0;
my $flag = 0;
my ($cmd, @tmp);
my $flagant = 0;
my ($s, $s2);
my ($good, $noecono) = (0,0);
my $crono;
say "$0 - v$VERSION     " . scalar(localtime());
say "Crono advisor of economode 10m moving average over 5m record";
say "Listado de media de actividad 5min con memoria alisada 10min:";
say "------------------------------------------------------------";

while (1){
    sleep 5 * 60;          # 5min -> the check is (not exactly) over 5 minutes
    $count++;
    
    # añadir más tarde que existe el cmd
    $cmd = `uptime`;
    @tmp = split /:\s/, $cmd; 
    $s = $tmp[-1];  
    $s =~ /\, (\d+[\.|\,]\d+)\, /;   # fase 1: tomar la cifra de en medio 5min
    
    $s2 = $1;                        # ESTA es la CANTIDAD!!!
    $flag++ if ($DEBUG && $s2);
    if ($flag > $flagant && $DEBUG && defined $s2 && $flag > 0) { 
	print " OK";
	$flagant = $flag;
    }else{
	warn "Error: can't get the capture";
    }
    
    if ( $s2 =~ s/(\d)[\,|\.](\d)/$1.$2/ ) { 
	;                                     # fase 2: convertir a número
	print " and is a number" if ($DEBUG && (0+$s2 eq $s2));
    }else{
	warn "Error: can't numerize";
    }
    
    $meancpu = ($s2 > 0) ? ($s2 /2 + $meancpu /2) : $meancpu/2 ;     # si es 1/10, ya se probó, y el factor de reducción ES BAJO
    
    # $crono = sprintf ("%.02f min", $count * 5 * 60);   # número de grupos de 5min * 5 y div 60 para mostrar tiempo en horas, flotantes 
    
    $crono = scalar( localtime() );    # Lo más informativo posible 

    print "\r$count)     5min: $crono      good $good    notecono $noecono      cpuuse\(mean\) ";
    printf "%.12f     ", $meancpu;    
    print " ";
    
    if ($meancpu =~ /0[\,|\.]0\d/ || $meancpu =~ /e\-/) {                            # superok - es float e-3 o más = milésima		
	print "|"; 
	$good++;
    }elsif ($meancpu =~ /0[\,|\.][1|2]/) {
	print "||";
	$good++;
    }elsif ($meancpu =~ /0[\,|\.][3|4]/) {
	print "|||";
	$good++;
    }elsif ($meancpu =~ /0[\.|\,][5|6]/) {    # según teoría del redondeo, 0.5 -> 0 cuanto es a 0, no +inf y -inf, pero como se quiere reportar bajo uso cpu, <= 0.4 es normal
	$good++;
	print "||||";
    }elsif ( $meancpu =~ /0[\.|\,][7|8|9]/ ){
	$good++;
	print "|||||";
    }else{
	$noecono++;
	print "   -+-   ";                                       # No gubernamental level
#    }else{
#	$noecono++;
    }      
    
    if ($count % 12 == 1){           # una hora son 12 veces 5min
	open my $fho, '>', "/home/jesus/src/sensor/5mincpuload.log" or die $!;
	print $fho $meancpu;
	close $fho;
	print "     saved!     ";
	
	if ($RNDPOOL13){
	    if (-e $RNDPOOL13){
		open my $fhrndpool13, '>>', $RNDPOOL13 or warn $!;
		say $fhrndpool13 $meancpu;
		close $fhrndpool13;
	    }else{
		# ...
		$ntask = `ps aux | wc -l`;
		chomp $ntask;
		$ntask--;
		print "     jobs $ntask  "; 
	    }
	}
	
    }else{ 
	print "    ", "~" x (15 * int(0.5 + $s2));                     # $s2 es la cantidad entera, chufa hasta 20 y pico 
    }
    say "";
}

exit 3;

__END__
  
Esta versión mira más la economía a más largo plazo del uso de la cpu
Ver script sens2 y sus variantes (sonido, nproc = ps aux | wc -l, etc)

