summaryrefslogtreecommitdiff
path: root/scripts/sort_res.perl5
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/sort_res.perl5')
-rwxr-xr-xscripts/sort_res.perl5135
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("");
+}