rpmsafereduce: revert
[nethome.git] / bin / psswap
1 #! /usr/bin/perl
2 use strict;
3 use warnings;
4 local *F;
5 my $pscmd="ps axwl";
6 open F,"$pscmd|" or die "$pscmd: $!";
7 my %pid;
8 my $rsstotal=0;
9 local $_;
10 while (<F>) {
11   /^(?:\S+\s+){2}(\S+)\s+(?:\S+\s+){4}(\S+)/ or die $_;
12   die if $pid{$1};
13   $pid{$1}=$_;
14   $rsstotal+=$2 if $2 ne "RSS";
15 }
16 close F or die "$pscmd: $!";
17 my $head=delete $pid{"PID"} or die;
18 my %swap;
19 for my $pid (keys(%pid)) {
20   my $line=$pid{$pid};
21   my $kb=0;
22   my $fn="/proc/$pid/smaps";
23   if (!open F,$fn) {
24     warn "$fn: $line: $!" if $line!~/ $pscmd$/;
25     next;
26   }
27   while (<F>) {
28     $kb+=$1 if /^Swap:\s+(\d+) kB\n$/;
29   }
30   close F or die "$fn: $!";
31   push @{$swap{$kb}},$line;
32 }
33 sub printfmt($$) {
34   my($kb,$line)=@_;
35   printf "%10s %s",$kb,$line;
36 }
37 printfmt "SWAP",$head;
38 my $swaptotal=0;
39 for my $kb (sort { $b<=>$a; } keys(%swap)) {
40   for my $line (@{$swap{$kb}}) {
41     printfmt $kb,$line;
42     $swaptotal+=$kb;
43   }
44 }
45 print "SWAP total: $swaptotal\n";
46 print "RSS total: $rsstotal\n";