|
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 |
}
|