--stas now works :3

This commit is contained in:
Zane C. B-H 2019-08-25 01:09:01 -05:00
parent d8401d1b9b
commit 5d7740f27e
1 changed files with 139 additions and 5 deletions

View File

@ -7,6 +7,8 @@ use Proc::ProcessTable::Match;
use Proc::ProcessTable; use Proc::ProcessTable;
use Text::ANSITable; use Text::ANSITable;
use Term::ANSIColor; use Term::ANSIColor;
use Statistics::Basic qw(:all);
use List::Util qw( min max sum );
=head1 NAME =head1 NAME
@ -46,6 +48,8 @@ sub new {
match=>undef, match=>undef,
minor_faults=>0, minor_faults=>0,
major_faults=>0, major_faults=>0,
cminor_faults=>0,
cmajor_faults=>0,
colors=>[ colors=>[
'BRIGHT_YELLOW', 'BRIGHT_YELLOW',
'BRIGHT_CYAN', 'BRIGHT_CYAN',
@ -72,6 +76,10 @@ sub new {
], ],
processColor=>'BRIGHT_RED', processColor=>'BRIGHT_RED',
nextColor=>0, nextColor=>0,
stats=>0,
jid=>0,
tty=>0,
numthr=>0,
}; };
bless $self; bless $self;
@ -85,7 +93,7 @@ sub new {
my @bool_feed=( my @bool_feed=(
'major_faults', 'minor_faults', 'cmajor_faults', 'major_faults', 'minor_faults', 'cmajor_faults',
'cminor_faults', 'numthr', 'tty', 'jid' 'cminor_faults', 'numthr', 'tty', 'jid', 'stats'
); );
foreach my $feed ( @bool_feed ){ foreach my $feed ( @bool_feed ){
@ -145,8 +153,8 @@ sub run{
} }
my $tb = Text::ANSITable->new; my $tb = Text::ANSITable->new;
$tb->border_style('Default::none_ascii'); # if not, a nice default is picked $tb->border_style('Default::none_ascii');
$tb->color_theme('Default::no_color'); # if not, a nice default is picked $tb->color_theme('Default::no_color');
# #
# assemble the headers # assemble the headers
@ -235,6 +243,12 @@ sub run{
$tb->columns( \@headers ); $tb->columns( \@headers );
my @stats_rss;
my @stats_vsz;
my @stats_time;
my @stats_pctcpu;
my @stats_pctmem;
my @td; my @td;
foreach my $proc ( @{ $procs } ) { foreach my $proc ( @{ $procs } ) {
my @new_line; my @new_line;
@ -258,6 +272,7 @@ sub run{
# handles the %CPU # handles the %CPU
# #
push( @new_line, color($self->nextColor).$proc->{pctcpu}.color('reset') ); push( @new_line, color($self->nextColor).$proc->{pctcpu}.color('reset') );
if ( $self->{stats} ){ push( @stats_pctcpu, $proc->{pctcpu} ); }
# #
# handles the %MEM # handles the %MEM
@ -265,19 +280,23 @@ sub run{
if ( $^O =~ /bsd/ ) { if ( $^O =~ /bsd/ ) {
my $mem=(($proc->{rssize} * 1024 * 4 ) / $physmem) * 100; my $mem=(($proc->{rssize} * 1024 * 4 ) / $physmem) * 100;
push( @new_line, color($self->nextColor).sprintf('%.2f', $mem).color('reset') ); push( @new_line, color($self->nextColor).sprintf('%.2f', $mem).color('reset') );
if ( $self->{stats} ){ push( @stats_pctmem, $mem ); }
} else { } else {
push( @new_line, color($self->nextColor).sprintf('%.2f', $proc->{pctcpu}).color('reset') ); push( @new_line, color($self->nextColor).sprintf('%.2f', $proc->{pctmem}).color('reset') );
if ( $self->{stats} ){ push( @stats_pctmem, $proc->{pctmem} ); }
} }
# #
# handles VSZ # handles VSZ
# #
push( @new_line, $self->memString( $proc->{size}, 'vsz') ); push( @new_line, $self->memString( $proc->{size}, 'vsz') );
if ( $self->{stats} ){ push( @stats_vsz, $proc->{size} ); }
# #
# handles the rss # handles the rss
# #
push( @new_line, $self->memString( $proc->{rss}, 'rss') ); push( @new_line, $self->memString( $proc->{rss}, 'rss') );
if ( $self->{stats} ){ push( @stats_rss, $proc->{rss} ); }
# #
# handles the info # handles the info
@ -458,6 +477,7 @@ sub run{
# handles the time column # handles the time column
# #
push( @new_line, $self->timeString( $proc->{time} ) ); push( @new_line, $self->timeString( $proc->{time} ) );
if ( $self->{stats} ){ push( @stats_time, $proc->{time} ); }
# #
# handle the command # handle the command
@ -476,7 +496,121 @@ sub run{
$tb->add_rows( \@td ); $tb->add_rows( \@td );
return $tb->draw; my $stats='';
if ( $self->{stats} ){
my $stb = Text::ANSITable->new;
$stb->border_style('Default::none_ascii');
$stb->color_theme('Default::no_color');
#
# assemble the headers
#
my @stats_headers;
push( @stats_headers, ' ' );
$stb->set_column_style($header_int, pad => 0);
push( @stats_headers, 'Min' );
$stb->set_column_style($header_int, pad => 1);
push( @stats_headers, 'Avg' );
$stb->set_column_style($header_int, pad => 0);
push( @stats_headers, 'Med' );
$stb->set_column_style($header_int, pad => 1);
push( @stats_headers, 'Max' );
$stb->set_column_style($header_int, pad => 0);
push( @stats_headers, 'StdDev' );
$stb->set_column_style($header_int, pad => 1);
push( @stats_headers, 'Sum' );
$stb->set_column_style($header_int, pad => 0);
$stb->columns( \@stats_headers );
my @std;
my $stats_avg=avg(@stats_pctcpu);
$stats_avg=~s/\,//g;
my $stats_median=median(@stats_pctcpu);
$stats_median=~s/\,//g;
my $stats_stddev=stddev(@stats_pctcpu);
$stats_stddev=~s/\,//g;
push( @std, [
'CPU%',
sprintf('%.2f', min( @stats_pctcpu )),
$stats_avg,
$stats_median,
sprintf('%.2f', max( @stats_pctcpu )),
$stats_stddev,
sprintf('%.2f', sum( @stats_pctcpu )),
]);
$stats_avg=avg(@stats_pctmem);
$stats_avg=~s/\,//g;
$stats_median=median(@stats_pctmem);
$stats_median=~s/\,//g;
$stats_stddev=stddev(@stats_pctmem);
$stats_stddev=~s/\,//g;
push( @std, [
'Mem%',
sprintf('%.2f', min( @stats_pctmem )),
$stats_avg,
$stats_median,
sprintf('%.2f', max( @stats_pctmem )),
$stats_stddev,
sprintf('%.2f', sum( @stats_pctmem )),
]);
$stats_avg=avg(@stats_vsz);
$stats_avg=~s/\,//g;
$stats_median=median(@stats_vsz);
$stats_median=~s/\,//g;
$stats_stddev=stddev(@stats_vsz);
$stats_stddev=~s/\,//g;
push( @std, [
'VSZ',
$self->memString( min( @stats_vsz), 'vsz'),
$self->memString( $stats_avg, 'vsz'),
$self->memString( $stats_median, 'vsz'),
$self->memString( max( @stats_vsz ), 'vsz'),
$self->memString( $stats_stddev, 'vsz'),
$self->memString( sum( @stats_vsz), 'vsz'),
]);
$stats_avg=avg(@stats_rss);
$stats_avg=~s/\,//g;
$stats_median=median(@stats_rss);
$stats_median=~s/\,//g;
$stats_stddev=stddev(@stats_rss);
$stats_stddev=~s/\,//g;
push( @std, [
'RSS',
$self->memString( min( @stats_rss ), 'rss'),
$self->memString( $stats_avg, 'rss'),
$self->memString( $stats_median, 'rss'),
$self->memString( max( @stats_rss ), 'rss'),
$self->memString( $stats_stddev, 'rss'),
$self->memString( sum( @stats_rss ), 'rss'),
]);
$stats_avg=avg(@stats_time);
$stats_avg=~s/\,//g;
$stats_median=median(@stats_time);
$stats_median=~s/\,//g;
$stats_stddev=stddev(@stats_time);
$stats_stddev=~s/\,//g;
push( @std, [
'Time',
$self->timeString( min( @stats_time ) ),
$self->timeString( $stats_avg ),
$self->timeString( $stats_median ),
$self->timeString( max( @stats_time ) ),,
$self->timeString( $stats_stddev ),
$self->timeString( sum( @stats_time ) ),
]);
$stb->add_rows( \@std );
$stats="\n".$stb->draw;
}
return $tb->draw.$stats;
} }
=head2 startString =head2 startString