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