Blame scripts/sort_res.perl5

Packit 6f02de
#!/usr/bin/perl
Packit 6f02de
# sort_res.perl5 - Script to group & sort lsof output by resource
Packit 6f02de
#
Packit 6f02de
# Copyright (c) 2004, 2005 - Fabian Frederick <fabian.frederick@gmx.fr>
Packit 6f02de
#
Packit 6f02de
# This program/include file is free software; you can redistribute it and/or
Packit 6f02de
# modify it under the terms of the GNU General Public License as published
Packit 6f02de
# by the Free Software Foundation; either version 2 of the License, or
Packit 6f02de
# (at your option) any later version.
Packit 6f02de
#
Packit 6f02de
# This program/include file is distributed in the hope that it will be
Packit 6f02de
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
Packit 6f02de
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 6f02de
# GNU General Public License for more details.
Packit 6f02de
#
Packit 6f02de
# You should have received a copy of the GNU General Public License
Packit 6f02de
# along with this program (in the main directory of the Linux-NTFS
Packit 6f02de
# distribution in the file COPYING); if not, write to the Free Software
Packit 6f02de
# Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit 6f02de
#
Packit 6f02de
# Note : 
Packit 6f02de
#	-This script uses lsof released by Victor A. Abell
Packit 6f02de
#	-lsof path recovery comes from standard perl scripts in there.
Packit 6f02de
#
Packit 6f02de
# Usage :
Packit 6f02de
#	perl sort_res.perl5 -> display used resources + size
Packit 6f02de
#	or perl sort_res.perl5 <program name>
Packit 6f02de
#
Packit 6f02de
# 12/2005 (FabF) 
Packit 6f02de
#	-size reset in loop (script was broken in 4.76)
Packit 6f02de
#	-isexec looking in .. (like other scripts)
Packit 6f02de
#	-display for one or all processes
Packit 6f02de
#	-removing unuseful line number arg.
Packit 6f02de
#	-display global size
Packit 6f02de
Packit 6f02de
require 'getopts.pl';
Packit 6f02de
my @args = @_;
Packit 6f02de
Packit 6f02de
# Set path to lsof.
Packit 6f02de
if (($LSOF = &isexec("../lsof")) eq "") {    # Some distros use lsof
Packit 6f02de
						    # out of $PATH
Packit 6f02de
    if (($LSOF = &isexec("lsof")) eq "") {	    # Then try . and $PATH
Packit 6f02de
	if (($LSOF = &isexec("../lsof")) eq "") {    # Then try ..
Packit 6f02de
	    print "can't execute $LSOF\n"; exit 1
Packit 6f02de
	}
Packit 6f02de
    }
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
if ($ARGV[0] ne ""){
Packit 6f02de
    $cmd="$LSOF -nPl -Fcns -c".$ARGV[0]."|";
Packit 6f02de
}else{
Packit 6f02de
    $cmd="$LSOF -nPl -Fcns|";	
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
#Parse lsof output to gather command, resource name, pid and size
Packit 6f02de
#Some extradata stand to keep script genericity 
Packit 6f02de
$i=0;
Packit 6f02de
if (open(FILE, $cmd)){
Packit 6f02de
    while (defined ($line=<FILE>)){
Packit 6f02de
	$cline=$line;
Packit 6f02de
	$cline =~ s"^(.)"";
Packit 6f02de
	$cline =~ s/^\s+|\s+$//g;
Packit 6f02de
	if($line=~m/^p/){
Packit 6f02de
	    $pid=$cline;
Packit 6f02de
	}else{
Packit 6f02de
	    if($line=~/^s/){
Packit 6f02de
		$size = $cline;
Packit 6f02de
	    }else{
Packit 6f02de
		if($line=~/^c/){
Packit 6f02de
		    $command = $cline;
Packit 6f02de
		}else{
Packit 6f02de
		    if($line=~/^n/){
Packit 6f02de
			$name = $cline;
Packit 6f02de
			$data{$i} = { command => $command, name => $name,
Packit 6f02de
				      pid => $pid , size => $size};
Packit 6f02de
			$size=0;
Packit 6f02de
			$i = $i+1;
Packit 6f02de
		    }
Packit 6f02de
		}
Packit 6f02de
	    }
Packit 6f02de
	}
Packit 6f02de
    }
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
#Resource name sorting
Packit 6f02de
sub byresname { $data{$a}{name} cmp $data{$b}{name}}
Packit 6f02de
@ks=sort byresname (keys %data);
Packit 6f02de
Packit 6f02de
#Resource grouping
Packit 6f02de
$i=0;
Packit 6f02de
$cname="a";
Packit 6f02de
foreach $k (@ks){
Packit 6f02de
    if ($data{$k}{name} ne $cname){
Packit 6f02de
	$dgroup{$i} = { name => $data{$k}{name}, size => $data{$k}{size}};
Packit 6f02de
	$cname = $data{$k}{name};
Packit 6f02de
	$i++;
Packit 6f02de
    }	
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
#Size sort on resource hash
Packit 6f02de
sub bysize { $dgroup{$a}{size} <=> $dgroup{$b}{size} }
Packit 6f02de
@ks=sort bysize (keys %dgroup);
Packit 6f02de
$gsize=0;
Packit 6f02de
printf("  -- KB --  -- Resource --\n", );
Packit 6f02de
foreach $k (@ks){
Packit 6f02de
	printf("%10d  %s\n", $dgroup{$k}{size}/1024, $dgroup{$k}{name});
Packit 6f02de
	$gsize+=$dgroup{$k}{size};
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
printf("Total KB : %10d\n", $gsize/1024);
Packit 6f02de
## isexec($path) -- is $path executable
Packit 6f02de
#
Packit 6f02de
# $path   = absolute or relative path to file to test for executabiity.
Packit 6f02de
#	    Paths that begin with neither '/' nor '.' that arent't found as
Packit 6f02de
#	    simple references are also tested with the path prefixes of the
Packit 6f02de
#	    PATH environment variable.  
Packit 6f02de
Packit 6f02de
sub
Packit 6f02de
isexec {
Packit 6f02de
    my ($path) = @_;
Packit 6f02de
    my ($i, @P, $PATH);
Packit 6f02de
Packit 6f02de
    $path =~ s/^\s+|\s+$//g;
Packit 6f02de
    if ($path eq "") { return(""); }
Packit 6f02de
    if (($path =~ m#^[\/\.]#)) {
Packit 6f02de
	if (-x $path) { return($path); }
Packit 6f02de
	return("");
Packit 6f02de
    }
Packit 6f02de
    $PATH = $ENV{PATH};
Packit 6f02de
    @P = split(":", $PATH);
Packit 6f02de
    for ($i = 0; $i <= $#P; $i++) {
Packit 6f02de
	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
Packit 6f02de
    }
Packit 6f02de
    return("");
Packit 6f02de
}