6 my $DEBUG = $ENV{DEBUG} || 0;
8 my $hostname = `hostname -s`;
12 sub XXX { $DEBUG ? warn "XXX ",Dumper( @_ ) : {} };
17 $ssh = "ssh $hostname ";
20 # if prefixed with _ it will be hiddden from output, _args must be last!
21 my @ps_cols = qw( user pid
32 sub ps_cols_all { map { my $t = $_; $t =~ s/^_//; $t } @ps_cols };
33 sub ps_cols_visible { grep { ! /^_/ } @ps_cols };
41 my @f = reverse ( 24, 60, 60, 1 );
42 my @p = reverse split(/[-:]/, $t);
47 #warn "### $i $p[$i] $f[$i]\n";
52 warn "# DD-hh:mm:ss $t -> $t_sec\n" if $DEBUG;
56 my $cmd = 'ps --no-headers axwwo ' . join(',', ps_cols_all);
58 open(my $ps, '-|', $ssh . $cmd);
64 @h{@ps_cols} = split(/\s+/, $_, $#ps_cols + 1);
65 $h{cputime} = DD_hh_mm_ss( $h{cputime} );
68 if ( $h{user} =~ m/gnt/ && $h{_args} =~ m/qemu.*-name\s+(\S+)/ ) {
71 $stat->{$name}->{$_} = $h{$_} foreach ps_cols_all;
73 while ( $h{_args} =~ m/mac=([0-9a-fA-F:]+)/g ) {
74 $mac_to_name->{$1} = $name;
78 # warn "## SKIP [$_]\n";
79 $stat->{ '__' . $hostname }->{$_} += $h{$_} foreach qw( pcpu pmem vsz rss cputime etimes maj_flt min_flt );
85 warn '# mac_to_name ', Dumper( $mac_to_name );
87 open(my $ip, '-|', $ssh . 'ip -s -o link');
90 if ( m/master\s+(\S+).+ether\s+([0-9a-fA-F:]+).+RX:\s+.+\\\s+(\d+).+TX:\s+.+\\\s+(\d+)/ ) {
91 my ( $br, $mac, $rx, $tx ) = ( $1, $2, $3, $4 );
92 if ( my $name = $mac_to_name->{$mac} ) {
93 $stat->{$name}->{link}->{ $br } = [ $rx, $tx ];
95 warn "## SKIP MAC $mac [$_]\n" if $DEBUG;
98 warn "## SKIP $_\n" if $DEBUG;
102 warn "# stat ", Dumper( $stat ) if $DEBUG;
108 foreach my $i ( 0 .. $#l ) {
109 my $len = length($l[$i]) || 0;
110 $lines->{len}->[$i] ||= $len;
111 $lines->{len}->[$i] = $len if $len > $lines->{len}->[$i];
113 push @{ $lines->{line} }, [ map { ! defined $_ ? '-' : $_ } @l ];
116 push_line '#name', ps_cols_visible;
118 foreach my $name ( sort keys %$stat ) {
119 # printf "%6.2f %6.2f %8d %6d %6s %s\n", ( map { $stat->{$name}->{$_} || '' } qw( pcpu pmem vsz pid user ) ), $name;
120 # print join("\t", $name, map { $stat->{$name}->{$_} } ps_cols_visible ), "\n";
121 push_line( $name, map { $stat->{$name}->{$_} } ps_cols_visible );
126 my $fmt = join(' ', map { '%' . $_ . 's' } @{ $lines->{len} } ) . "\n";
127 warn "# fmt = [$fmt]" if $DEBUG;
128 foreach my $line ( @{ $lines->{line} } ) {